<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>