<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="moz-cite-prefix">For what its worth, I was interested to
find that the simple Freeglut / OpenGL demo programs I've tried on
Windows also work on my WSL Ubuntu with the Windows generated
jextract classes via X server. <br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">All I changed was remove the "-l
opengl32 -l freeglut" parameters from Windows jextract run so that
it did not inject the Windows loadLibrary calls into
RuntimeHelper.java, and substitute equivalent code into the demo
instead, like this<br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix"> System.out.format("Initialise
freeglut for os.name=%s%n", System.getProperty("os.name"));<br>
final String[] libs =
System.getProperty("os.name").startsWith("Windows")<br>
? new String[]{"opengl32", "freeglut"}
: new String[]{"glut"};<br>
for (String lib : libs) {<br>
System.out.format("loadLibrary(\"%s\")%n", lib);<br>
System.loadLibrary(lib);<br>
}<br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">I guess I am lucky the APIs and struct
used by the simple code sample are consistent.</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">Kind regards</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">Duncan<br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix"><br>
</div>
<div class="moz-cite-prefix">On 20/12/2022 15:51, Maurizio
Cimadamore wrote:<br>
</div>
<blockquote type="cite"
cite="mid:690e5e0f-4768-7477-b8ad-2ba3737cf580@oracle.com">
<p>Hi Martin,<br>
at the time of writing, jextract does not have a solution for
this.</p>
<p>I also believe that a general solution might not even exist -
sometimes the bindings can vary quite wildly across different
platforms, and there could be significant layout mismatches
which would be hard to reconcile. For instance on Windows,
C_LONG is a layout with type ValueLayout.OfInt, whereas on Linux
x64 the type is ValueLayout.OfLong. On top of that, some subset
of native functions might only be available on some platforms
but not in others, etc.</p>
<p>Considering all this, while some automated solution might be
possible for the use case you have in mind, most surely it would
fail to scale to the general case - so the general
recommendation is to generate different bindings (one per
platform) and then come up with some abstraction layer on top
(which is sort of what you are trying to do). Another approach
that might work would be to work at a lower level - and generate
ad-hoc downcall method handles which automagically fix up
mismatches that can arise across platforms (e.g. if a function
is available in two platforms with a parameter mismatch int vs.
long, adapt the int-accepting method handle to take a long, so
that a uniform signature can be used). Note that jextract should
expose the method handles it generates, so perhaps this
adaptation can be done semi-automatically based on what comes
out of jextract (and based on what the mismatches really are in
your use case). <br>
</p>
<p>I know that e.g. the JavaDoesUSB [1] project has faced similar
issues, so perhaps their authors might want to share some
insights here.</p>
<p>Cheers<br>
Maurizio<br>
<br>
[1] - <a class="moz-txt-link-freetext"
href="https://github.com/manuelbl/JavaDoesUSB"
moz-do-not-send="true">https://github.com/manuelbl/JavaDoesUSB</a><br>
</p>
<div class="moz-cite-prefix">On 20/12/2022 15:04, Martin Pernollet
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:74cJVGa9pM5ITkWNNcQWqDEttFfBMlhbKsdBGH25SduiUtoPEsY2Parc7F9Ei4EEzNVd6LSIYgu_vUyjGKY_H8LxU7m4OhgQVZ7AW_VNjPg=@protonmail.com">
<div>Hi everyone,</div>
<div><br>
</div>
<div>I am back on track with OpenGL binding with Panama!</div>
<div><br>
</div>
<div>I have one code design / tooling question related to
JExtract : is it possible to <b>generate a common interface
that would be implemented by all platform specific binding</b>
generated by JExtract since JDK 19 or 20?</div>
<div><br>
</div>
<div>Here's my use case in more detail : I've been advised to
generate <b>different binding for different OS</b> (and maybe
version). For OpenGL, this lead me to a glut_h binding for
macOS, one for Windows and one for Linux.</div>
<div><br>
</div>
<div>To let <b>the user/developer face a single entry point</b>,
I manually write a <a
href="https://github.com/jzy3d/panama-gl/blob/feature/fbo/src/main/java/opengl/GL.java"
title="GL interface" moz-do-not-send="true">GL interface</a>.
I then define a <a
href="https://github.com/jzy3d/panama-gl/blob/feature/fbo/src/main/java/opengl/macos/GL_macOS_10_15_3.java"
title="GL_macOS_10_15_3" moz-do-not-send="true">GL_macOS_10_15_3</a>
class that wraps the binding (!). When I expand the prototype
to Windows, I should copy paste this to GL_Windows_10 and
modify the imports to reference the appropriate bindings. The
goal is to write code like this</div>
<div><br>
</div>
<div>GL gl = Platform.selectAmong(GL_macOS_10_15_3.class,
GL_windows_10.class, ...)</div>
<div>gl.glDoSomething()</div>
<div><br>
</div>
<div>I don't think there would be another way to have java
developer write <b>applications that ignore the target
hardware</b>. However my approach is stupid : time consuming
and error prone because manual. A real life case may have 10
implementations and 1000 functions.</div>
<div><br>
</div>
<div><b>Does JExtract provide a solution to this</b>? Should I
create this tool by myself based on all generated bindings ?
Would anyone <b>recommend something smarter</b>?</div>
<div><br>
</div>
<div>Regards,</div>
<div><br>
</div>
<div>Martin </div>
<div><br>
</div>
<div class="protonmail_signature_block"> </div>
</blockquote>
</blockquote>
<p><br>
</p>
</body>
</html>