2010-12-13 9 views
6

Używany przeze mnie słoik próbuje załadować natywną bibliotekę przy użyciu System.loadLibrary. Myślę, że dzieje się tak, że jedna z ładowanych bibliotek ma zależność od innej natywnej biblioteki. Wskazywanie opcji -Djava.library.path w tym przypadku nie działa poprawnie. Instrukcje ze strony aplikacji są umieszczane w katalogu jre/bin, ale myślę, że jest to bardzo zły pomysł (szczególnie przy próbie wdrożenia na stronach klienta).Java System.loadLibrary dependencies

Tak, to naprawdę jest 2 części.

  1. Czy ma sens, że jeśli rodzime lib próbuje załadować kolejną rodzimą lib że -Djava.library.path nie działa?

  2. Czy istnieje dobre rozwiązanie w celu obejścia tego problemu? Chyba mógłbym jawnie wywołać System.loadLibrary na wszystkich bibliotekach dll (nie jestem nawet pewien, czy to zadziała), ale musiałbym się upewnić, aby wywołać je w poprawnej kolejności, w przeciwnym razie będę miał ten sam problem.

EDIT: Myślę, że to ma sens, że to się dzieje, a najlepszym rozwiązaniem, jakie do tej pory przeczytać jest użycie Dependency Walker, aby zrozumieć to, a następnie załadować je w odwrotnej kolejności ... ale jestem otwarty na propozycje lepszych ...

dzięki, Jeff

Odpowiedz

4

Tak, to ma sens, że biblioteki natywne nie użyć właściwości -Djava.library.path Java odwołuje się do innych bibliotek natywnych.

Niektóre z możliwych podejść:

  • Trzecia partia-jar jest ustalona, ​​aby załadować własne zależności, powołując się na java.library.path.
  • Twój kod ładuje biblioteki DLL wymagane przez słoik innej firmy w odwrotnym topograficznym sortowaniu. Jednak powoduje to, że twój kod określa zależności słoja firm trzecich. Te zależności mogą się zmienić.
  • Używa się ścieżki wyszukiwania DLL właściwej dla systemu operacyjnego (np. Przy użyciu LD_LIBRARY_PATH w systemie Unix/Linux/Mac lub PATH w systemie Windows). Może to jednak wymagać skryptu startowego.
+1

Próbowałem ładować w kolejności odwrotnej, i to działa, więc może wykorzystam to podejście, chyba że jest jakieś magiczne rozwiązanie, którego mi brakuje. –

+0

To pewnie też bym zrobił, poza możliwością zgłoszenia usterki osobie trzeciej. Jeśli korzystasz z oprogramowania wieloplatformowego, dynamicznie powiązane biblioteki mogą się różnić między platformami. Powodzenia! –