Ich verwende Java Web Start, um eine Java-Anwendung zu starten, die von nativen Bibliotheken von Drittanbietern abhängig ist. Diese systemeigenen Bibliotheken laden anschließend eine andere native Bibliothek (commonLib
) als ihre Abhängigkeit mit LoadLibrary/dlopen.Java Web Start - native Abhängigkeit mit einer anderen nativen Abhängigkeit laden
Wenn Web Start nicht verwendet wird, funktioniert alles wie erwartet, wenn sich die systemeigenen Bibliotheken im selben Verzeichnis befinden.
Web Start jedoch die nativen Bibliotheken erfordert in einer JAR-Datei und verwiesen in der jnlp-Datei gepackt werden, was ich getan habe:
<!-- Windows OS -->
<resources os="Windows">
<nativelib href="native/native-windows.jar" />
</resource>
<!-- Linux OS -->
<resources os="Linux">
<nativelib href="native/native-linux.jar" />
</resources>
<!-- Mac OSX -->
<resources os="Mac OS X">
<nativelib href="native/native-osx.jar"/>
</resources>
Die nativen Bibliotheken laden in Ordnung, aber sie versagen, ihre Abhängigkeit laden commonLib
- Der C++ LoadLibrary/dlopen-Aufruf schlägt fehl, da die Datei in einem jar/cache-Ordner vorhanden ist und nicht im aktuellen Bibliothekssuchpfad.
Unter Windows konnte ich dieses Problem durch die Vorbelastung commonLib
in Java lösen, bevor Sie die JNI-Bibliothek zu laden, etwa so:
System.loadLibrary("commonLib");
System.loadLibrary("myNativeLib");
Doch dieser Ansatz funktioniert nicht auf OS X - dlopen im systemeigenen Code schlägt fehl. dlopen ist anscheinend nicht schlau genug, nicht zu versuchen, die Bibliothek erneut zu laden, wenn sie bereits geladen ist.
Gibt es eine plattformübergreifende Möglichkeit zum Packen und Laden nativer Bibliotheken, die von anderen nativen Bibliotheken in Java Web Start abhängen?
Enthalten die Gläser alle beteiligten Eingeborenen? –
Ja, das habe ich überprüft. –