<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="markdown-here-wrapper" data-md-url="" style="">
      <p style="margin: 0px 0px 1.2em !important;">On 20/08/2024 23:42,
        <a class="moz-txt-link-abbreviated" href="mailto:some-java-user-99206970363698485155@vodafonemail.de">some-java-user-99206970363698485155@vodafonemail.de</a> wrote:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:f93c5d72-2e96-4c9f-a367-21658e2a43be@vodafonemail.de">Hello,
          <br>
          <br>
          first of all thank you for your work on the FFM API and
          jextract! It is really great that interoperability with native
          libraries becomes easier.
          <br>
          <br>
          One issue I currently have with jextract is that none of its
          `--library` or `--use-system-load-library` options seem to
          offer a way for users to provide their own SymbolLookup. Why
          is this an issue?
          <br>
          - The header class generated by jextract and possibly
          additional bindings classes might be generated by a
          third-party project, so you cannot easily modify the source
          code to change the SymbolLookup creation (unless you want to
          fork that project).
          <br>
          - For convenience Java projects often bundle native libraries,
          extract them to a temporary file and then load them, for
          example even JavaFX does this (see its `NativeLibLoader`
          class). This avoids requiring users to configure
          `java.library.path`. There are probably advantages and
          disadvantages with this approach, but nonetheless it would be
          useful if developers had the choice, by providing their own
          SymbolLookup and specifying the path of the library.
          <br>
          - `SymbolLookup#libraryLookup` seems to be currently the only
          API which allows manually unloading the library (by closing
          the `Arena`). All other approaches either keep the library
          loaded until JVM exit, or until the classloader is garbage
          collected which might be JVM exit as well (?).
          <br>
            Especially on Windows this is a problem because it prevents
          the deletion of the file while the library is loaded, so
          `File#deleteOnExit` or similar won't have any effect.
          <br>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <p style="margin: 0px 0px 1.2em !important;">Well, jextract
        generates code. If you have your own lookup, jextract cannot
        know what code to generate. One option would be to use a service
        loader (as you suggest), but this would require a jextract
        runtime library, which we don’t want (unless the service is in
        the JDK, which we also don’t want).</p>
      <p style="margin: 0px 0px 1.2em !important;">An option that often
        works in these cases is to NOT use any —library option. Jextract
        will generate nothing, but will use the loader lookup. So you
        are free to “influence” what’s in the loader lookup as you wish
        (e.g. by calling System::loadLibrary). This tend to work for
        native libraries distributed via maven inside jars (but with the
        limitation that you cannot unload).</p>
      <p style="margin: 0px 0px 1.2em !important;">Another option, which
        we are considering for the long term, is to change the bindings
        so that jextract will generate a “default” instantiation of a
        binding, but then you can also use the provided constructor to
        specify your own lookup. Something like this:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;"> class OpenGL {
     int GL_VERSION(); // this is an _instance method_
     ... // other bindings



    OpenGL(SymbolLookup lookup) { ... }

     static final OpenGL LIB = new OpenGL(/* lookup selected from command line option */);
 }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">This gives you
        bindings that are “ready to use”, pretty much as today - but in
        addition, you can create your own “LIB” instance with whatever
        lookup you want. I believe this is where we want to go (and this
        doesn’t suffer from the pesky problems you described with the
        service provider interface having to decide in which arena to
        work).</p>
      <p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
      <div title="MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDIwLzA4LzIwMjQgMjM6
NDIsIHNvbWUtamF2YS11c2VyLTk5MjA2OTcwMzYzNjk4NDg1MTU1QHZvZGFmb25lbWFpbC5kZSB3
cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOmY5M2M1ZDcy
LTJlOTYtNGM5Zi1hMzY3LTIxNjU4ZTJhNDNiZUB2b2RhZm9uZW1haWwuZGUiPkhlbGxvLAo8YnI+
Cjxicj5maXJzdCBvZiBhbGwgdGhhbmsgeW91IGZvciB5b3VyIHdvcmsgb24gdGhlIEZGTSBBUEkg
YW5kIGpleHRyYWN0ISBJdCBpcyAKcmVhbGx5IGdyZWF0IHRoYXQgaW50ZXJvcGVyYWJpbGl0eSB3
aXRoIG5hdGl2ZSBsaWJyYXJpZXMgYmVjb21lcyBlYXNpZXIuCjxicj4KPGJyPk9uZSBpc3N1ZSBJ
IGN1cnJlbnRseSBoYXZlIHdpdGggamV4dHJhY3QgaXMgdGhhdCBub25lIG9mIGl0cyBgLS1saWJy
YXJ5YCAKb3IgYC0tdXNlLXN5c3RlbS1sb2FkLWxpYnJhcnlgIG9wdGlvbnMgc2VlbSB0byBvZmZl
ciBhIHdheSBmb3IgdXNlcnMgdG8gCnByb3ZpZGUgdGhlaXIgb3duIFN5bWJvbExvb2t1cC4gV2h5
IGlzIHRoaXMgYW4gaXNzdWU/Cjxicj4tIFRoZSBoZWFkZXIgY2xhc3MgZ2VuZXJhdGVkIGJ5IGpl
eHRyYWN0IGFuZCBwb3NzaWJseSBhZGRpdGlvbmFsIApiaW5kaW5ncyBjbGFzc2VzIG1pZ2h0IGJl
IGdlbmVyYXRlZCBieSBhIHRoaXJkLXBhcnR5IHByb2plY3QsIHNvIHlvdSAKY2Fubm90IGVhc2ls
eSBtb2RpZnkgdGhlIHNvdXJjZSBjb2RlIHRvIGNoYW5nZSB0aGUgU3ltYm9sTG9va3VwIGNyZWF0
aW9uIAoodW5sZXNzIHlvdSB3YW50IHRvIGZvcmsgdGhhdCBwcm9qZWN0KS4KPGJyPi0gRm9yIGNv
bnZlbmllbmNlIEphdmEgcHJvamVjdHMgb2Z0ZW4gYnVuZGxlIG5hdGl2ZSBsaWJyYXJpZXMsIGV4
dHJhY3QgCnRoZW0gdG8gYSB0ZW1wb3JhcnkgZmlsZSBhbmQgdGhlbiBsb2FkIHRoZW0sIGZvciBl
eGFtcGxlIGV2ZW4gSmF2YUZYIApkb2VzIHRoaXMgKHNlZSBpdHMgYE5hdGl2ZUxpYkxvYWRlcmAg
Y2xhc3MpLiBUaGlzIGF2b2lkcyByZXF1aXJpbmcgdXNlcnMgCnRvIGNvbmZpZ3VyZSBgamF2YS5s
aWJyYXJ5LnBhdGhgLiBUaGVyZSBhcmUgcHJvYmFibHkgYWR2YW50YWdlcyBhbmQgCmRpc2FkdmFu
dGFnZXMgd2l0aCB0aGlzIGFwcHJvYWNoLCBidXQgbm9uZXRoZWxlc3MgaXQgd291bGQgYmUgdXNl
ZnVsIGlmIApkZXZlbG9wZXJzIGhhZCB0aGUgY2hvaWNlLCBieSBwcm92aWRpbmcgdGhlaXIgb3du
IFN5bWJvbExvb2t1cCBhbmQgCnNwZWNpZnlpbmcgdGhlIHBhdGggb2YgdGhlIGxpYnJhcnkuCjxi
cj4tIGBTeW1ib2xMb29rdXAjbGlicmFyeUxvb2t1cGAgc2VlbXMgdG8gYmUgY3VycmVudGx5IHRo
ZSBvbmx5IEFQSSB3aGljaCAKYWxsb3dzIG1hbnVhbGx5IHVubG9hZGluZyB0aGUgbGlicmFyeSAo
YnkgY2xvc2luZyB0aGUgYEFyZW5hYCkuIEFsbCAKb3RoZXIgYXBwcm9hY2hlcyBlaXRoZXIga2Vl
cCB0aGUgbGlicmFyeSBsb2FkZWQgdW50aWwgSlZNIGV4aXQsIG9yIHVudGlsIAp0aGUgY2xhc3Ns
b2FkZXIgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgd2hpY2ggbWlnaHQgYmUgSlZNIGV4aXQgYXMgd2Vs
bCAoPykuCjxicj4mbmJzcDsgRXNwZWNpYWxseSBvbiBXaW5kb3dzIHRoaXMgaXMgYSBwcm9ibGVt
IGJlY2F1c2UgaXQgcHJldmVudHMgdGhlIApkZWxldGlvbiBvZiB0aGUgZmlsZSB3aGlsZSB0aGUg
bGlicmFyeSBpcyBsb2FkZWQsIHNvIGBGaWxlI2RlbGV0ZU9uRXhpdGAgCm9yIHNpbWlsYXIgd29u
J3QgaGF2ZSBhbnkgZWZmZWN0Lgo8YnI+PC9ibG9ja3F1b3RlPjxicj48cD5XZWxsLCBqZXh0cmFj
dCBnZW5lcmF0ZXMgY29kZS4gSWYgeW91IGhhdmUgeW91ciBvd24gbG9va3VwLCBqZXh0cmFjdCAK
Y2Fubm90IGtub3cgd2hhdCBjb2RlIHRvIGdlbmVyYXRlLiBPbmUgb3B0aW9uIHdvdWxkIGJlIHRv
IHVzZSBhIHNlcnZpY2UgCmxvYWRlciAoYXMgeW91IHN1Z2dlc3QpLCBidXQgdGhpcyB3b3VsZCBy
ZXF1aXJlIGEgamV4dHJhY3QgcnVudGltZSBsaWJyYXJ5LCB3aGljaCB3ZSAKZG9uJ3Qgd2FudCAo
dW5sZXNzIHRoZSBzZXJ2aWNlIGlzIGluIHRoZSBKREssIHdoaWNoIHdlIGFsc28gZG9uJ3Qgd2Fu
dCkuPC9wPgo8cD5BbiBvcHRpb24gdGhhdCBvZnRlbiB3b3JrcyBpbiB0aGVzZSBjYXNlcyBpcyB0
byBOT1QgdXNlIGFueSAtLWxpYnJhcnkKIG9wdGlvbi4gSmV4dHJhY3Qgd2lsbCBnZW5lcmF0ZSBu
b3RoaW5nLCBidXQgd2lsbCB1c2UgdGhlIGxvYWRlciBsb29rdXAuCiBTbyB5b3UgYXJlIGZyZWUg
dG8gImluZmx1ZW5jZSIgd2hhdCdzIGluIHRoZSBsb2FkZXIgbG9va3VwIGFzIHlvdSB3aXNoIAoo
ZS5nLiBieSBjYWxsaW5nIFN5c3RlbTo6bG9hZExpYnJhcnkpLiBUaGlzIHRlbmQgdG8gd29yayBm
b3IgbmF0aXZlIGxpYnJhcmllcyBkaXN0cmlidXRlZCB2aWEgbWF2ZW4gaW5zaWRlIGphcnMgKGJ1
dCB3aXRoIHRoZSBsaW1pdGF0aW9uIHRoYXQgeW91IGNhbm5vdCB1bmxvYWQpLjxicj48L3A+Cjxw
PkFub3RoZXIgb3B0aW9uLCB3aGljaCB3ZSBhcmUgY29uc2lkZXJpbmcgZm9yIHRoZSBsb25nIHRl
cm0sIGlzIHRvIApjaGFuZ2UgdGhlIGJpbmRpbmdzIHNvIHRoYXQgamV4dHJhY3Qgd2lsbCBnZW5l
cmF0ZSBhICJkZWZhdWx0IiAKaW5zdGFudGlhdGlvbiBvZiBhIGJpbmRpbmcsIGJ1dCB0aGVuIHlv
dSBjYW4gYWxzbyB1c2UgdGhlIHByb3ZpZGVkIApjb25zdHJ1Y3RvciB0byBzcGVjaWZ5IHlvdXIg
b3duIGxvb2t1cC4gU29tZXRoaW5nIGxpa2UgdGhpczo8L3A+CjxwPmBgYDxicj4KY2xhc3MgT3Bl
bkdMIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgR0xfVkVSU0lPTigpOyAvLyB0aGlzIGlz
IGFuIF9pbnN0YW5jZSBtZXRob2RfPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgLi4uIC8vIG90aGVy
IGJpbmRpbmdzPC9wPgo8cD4mbmJzcDsmbmJzcDsmbmJzcDsgT3BlbkdMKFN5bWJvbExvb2t1cCBs
b29rdXApIHsgLi4uIH08YnI+CiAgPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljIGZpbmFs
IE9wZW5HTCBMSUIgPSBuZXcgT3BlbkdMKC8qIGxvb2t1cCBzZWxlY3RlZCBmcm9tIGNvbW1hbmQg
bGluZSBvcHRpb24gKi8pOzxicj4KfTxicj4KYGBgPC9wPgo8cD5UaGlzIGdpdmVzIHlvdSBiaW5k
aW5ncyB0aGF0IGFyZSAicmVhZHkgdG8gdXNlIiwgcHJldHR5IG11Y2ggYXMgdG9kYXkKIC0gYnV0
IGluIGFkZGl0aW9uLCB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biAiTElCIiBpbnN0YW5jZSB3aXRo
IHdoYXRldmVyCiBsb29rdXAgeW91IHdhbnQuIEkgYmVsaWV2ZSB0aGlzIGlzIHdoZXJlIHdlIHdh
bnQgdG8gZ28gKGFuZCB0aGlzIGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhlIHBlc2t5IHByb2JsZW1z
IHlvdSBkZXNjcmliZWQgd2l0aCB0aGUgc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UgaGF2aW5n
IHRvIGRlY2lkZSBpbiB3aGljaCBhcmVuYSB0byB3b3JrKS48L3A+PHA+TWF1cml6aW88YnI+PC9w
Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>