<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <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">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 style="font-family: Arial; font-size: 14px;">Hi everyone,</div>
      <div style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">I am back on
        track with OpenGL binding with Panama!</div>
      <div style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">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 style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">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 style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">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 style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">GL gl =
        Platform.selectAmong(GL_macOS_10_15_3.class,
        GL_windows_10.class, ...)</div>
      <div style="font-family: Arial; font-size: 14px;">gl.glDoSomething()</div>
      <div style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">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 style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;"><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 style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">Regards,</div>
      <div style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div style="font-family: Arial; font-size: 14px;">Martin   </div>
      <div style="font-family: Arial; font-size: 14px;"><br>
      </div>
      <div class="protonmail_signature_block" style="font-family: Arial;
        font-size: 14px;">
      </div>
    </blockquote>
  </body>
</html>