Sto utilizzando Java Web Start per avviare un'applicazione Java che dipende da alcune librerie native di terze parti. Queste librerie native caricano successivamente un'altra libreria nativa (commonLib
) come dipendenza usando LoadLibrary/dlopen.Java Web Start - carica dipendenza nativa con un'altra dipendenza nativa
Quando non si utilizza Web Start, tutto funziona come previsto quando le librerie native si trovano nella stessa directory.
Web Start, tuttavia, richiede le librerie native per essere confezionati in un file jar e fa riferimento nel file JNLP, che ho fatto:
<!-- 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>
Le librerie native caricano bene, ma non riescono a caricare la loro dipendenza commonLib
- la chiamata C++ LoadLibrary/dlopen non riesce perché il file è presente in qualche cartella jar/cache non nel percorso di ricerca della libreria corrente.
Su Windows, sono stato in grado di risolvere questo problema pre-caricamento commonLib
in Java prima di provare a caricare la libreria JNI, in questo modo:
System.loadLibrary("commonLib");
System.loadLibrary("myNativeLib");
Tuttavia, questo approccio non funziona su OS X - dlopen nel codice nativo fallisce. dlopen apparentemente non è abbastanza intelligente da non provare a caricare di nuovo la libreria se è già stata caricata.
Esiste un modo multipiattaforma per imballare e caricare librerie native che dipendono da altre librerie native in Java Web Start?
I barattoli contengono tutti i nativi coinvolti? –
Sì, ricontrollato. –