Używam Java Web Start, aby uruchomić aplikację Java, która zależy od bibliotek natywnych innych firm. Te natywne biblioteki następnie ładują inną natywną bibliotekę (commonLib
) jako swoją zależność za pomocą LoadLibrary/dlopen.Java Web Start - załaduj rodzimą zależność z inną rodzimą zależnością.
Gdy nie korzystasz z Web Start, wszystko działa zgodnie z oczekiwaniami, gdy natywne biblioteki znajdują się w tym samym katalogu.
Web Start wymaga jednak rodzime biblioteki mają być pakowane w pliku jar i odwołuje w pliku jnlp, co robiłam:
<!-- 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>
rodzime biblioteki załadować w porządku, ale nie udaje im się załadować ich uzależnienia commonLib
- wywołanie funkcji C++ LoadLibrary/dlopen nie powiodło się, ponieważ plik znajduje się w folderze jar/cache, a nie w bieżącej ścieżce wyszukiwania biblioteki.
W Windows, udało mi się rozwiązać ten problem przez pre-loading commonLib
w Javie przed próbuje załadować biblioteki JNI, tak:
System.loadLibrary("commonLib");
System.loadLibrary("myNativeLib");
Jednak takie podejście nie działa na OS X - dlopen w natywnym kodzie nie działa. dlopen najwyraźniej nie jest wystarczająco inteligentny, aby nie spróbować ponownie załadować biblioteki, jeśli jest już załadowany.
Czy istnieje międzyplatformowy sposób pakowania i ładowania bibliotek rodzimych zależnych od innych bibliotek natywnych w Java Web Start?
Czy słoiki zawierają wszystkich tubylców? –
Tak, sprawdź to. –