2009-11-20 13 views
5

Z powodzeniem integruję proste moduły Java w środowisku MATLAB w systemie Windows. Ostatnio napotkałem problem z biblioteką innej firmy, która próbuje załadować bibliotekę dll.UnsatisfiedLinkError Podczas ładowania biblioteki z Java w MATLAB

Java ClassLoader rzuca UnsatisfiedLinkError gdy obciążenie jest próba:

java.lang.UnsatisfiedLinkError: no <libname> in java.library.path 

at java.lang.ClassLoader.loadLibrary(Unknown Source) 

at java.lang.Runtime.loadLibrary0(Unknown Source) 

at java.lang.System.loadLibrary(Unknown Source) 

Wyjątkiem donosi, że mój „libname” nie jest w nieruchomości java.library.path. Zweryfikowałem, że właściwość rzeczywiście zawiera poprawną ścieżkę i że plik libname.dll istnieje w tej ścieżce.

Sprawdziłem java.library.path na dwa sposoby. Po pierwsze, ja po prostu sprawdził, że wartość zwracana w wierszu poleceń MATLAB:

>> java.lang.System.getProperty('java.library.path') 

Potem zmodyfikowano metodę javy w pytaniu do wydrukowania tej wartości tuż przed wezwanie do uszkodzonej funkcji osób trzecich:

System.out.println(System.getProperty('java.library.path')); 

Obie potwierdziły, że moja wartość ścieżki została ustawiona zgodnie z oczekiwaniami.

Próbowałem też ręcznie ładować bibliotekę z wiersza poleceń, ale nie udało się uzyskać tych samych wyników.

Czy jest to coś, co nie jest możliwe w programie MATLAB, czy też coś tu brakuje? Niestety nie jestem administratorem tego komputera, więc nie mogę wypróbować starej sztuczki przeniesienia biblioteki dll do katalogu z bibliotekami DLL, które działają.

Z zadowoleniem przyjmuję wszelkie sugestie dotyczące spraw, które należy wypróbować, jeśli nie ma odpowiedzi absolutnej.

Platforma: Windows XP MATLAB R2009a Java 1.6

+0

jak ty weryfikacji wartość właściwości java.library.path? –

+0

@matt b: Dodałem szczegóły do ​​wpisu w odpowiedzi na twoje pytanie. –

+0

Czy widzisz, jaką bibliotekę próbuje załadować kod strony trzeciej (patrząc na źródło)? czy to ta sama biblioteka, która została zgłoszona w UnsatisfiedLinkError? – bm212

Odpowiedz

4

Wystarczy znaleźć to w docs MATLAB:

określający ścieżkę przeszukiwania dla Sun Java Native Method bibliotek DLL

Mechanizm że MATLAB używa do zlokalizowania natywnych bibliotek metod, które są wymagane przez Java ma zmienione. MATLAB nie używa już zmiennych środowiskowych systemu do definiowania ścieżek do tych bibliotek.

kompatybilności Rozważania

Jeśli obecnie polegać na ścieżce (dla systemu Windows) lub LD_LIBRARY_PATH (dla UNIX) zmiennych środowiskowych, w tym celu trzeba będzie użyć librarypath.txt pliku, jak opisano poniżej, Na swoim miejscu.

Określanie ścieżki biblioteki Java

klasy Java mogą dynamicznie ładować rodzimych metod przy użyciu metody Java java.lang.System.loadLibrary ("LibFile"). Aby oprogramowanie JVM zlokalizowało określony plik biblioteki, katalog zawierający go musi znajdować się na ścieżce biblioteki Java. Ta ścieżka jest ustanawiane po MATLAB uruchamia oprogramowanie JVM przy starcie, a opiera się na zawartości pliku

$ Matlab/przybornik/local/librarypath.txt

(gdzie $ Matlab jest katalog główny przedstawiciel MATLAB przez MATLAB słowo kluczowe matlabroot).

Można rozszerzyć ścieżkę wyszukiwania dla bibliotek metod macierzystych, edytując plik librarypath.txt. Podczas edytowania tego pliku należy postępować zgodnie z poniższymi wskazówkami:

  • Sam określa każdy nowy katalog w linii.
  • Podaj tylko nazwy katalogów, a nie nazwy plików DLL. Wywołanie LoadLibrary robi to za Ciebie.
  • Aby uprościć specyfikację katalogów w środowiskach międzyplatformowych, można użyć dowolnego z następujących makr: $ matlabrot, $ arch i $ jre_home.
+0

ciekawe i dziwne w tym samym czasie. dlaczego mieliby robić tak dziwną rzecz? – jitter

4

Czy znasz Process Monitor? (Jeśli nie, łatwo zrozumiesz, jak to działa).

Pobierz. Uruchom. Po prostu włącz "Pokaż aktywność systemu plików" (małe ikony na prawo pod paskiem menu), wyłącz pozostałe.

Następnie odpal wszystko, co powoduje, że biblioteka próbuje załadować bibliotekę dll. Po wystąpieniu UnsatisfiedLinkError zatrzymaj przechwytywanie zdarzeń w Monitorze procesu.

Teraz wykonaj CTRL + F i wyszukaj nazwę biblioteki DLL, którą należy załadować. Sprawdź (prawdopodobnie wiele) wpis, który mówi "Nie znaleziono" lub "Nazwa nie znaleziona" w kolumnie wyników oraz z nazwą biblioteki DLL w kolumnie ścieżki.

Teraz sprawdź, gdzie naprawdę wygląda biblioteka dll. Może dołącza jakąś dodatkową ścieżkę lub coś podobnego, a więc nie może jej znaleźć.

+0

To dobra sugestia, ale niestety jest to bezpieczny komputer - nie będę mógł zainstalować ani uruchomić niezatwierdzonych aplikacji innych firm. Czy istnieje sposób, w jaki mógłbym osiągnąć to samo poprzez oprzyrządowanie kodu (poza zwykłym potwierdzeniem właściwości ścieżki, jak to zaznaczono)? –

+0

Świetna odpowiedź, dziękuję! – volni

0

Czy twoja biblioteka zależy od innych bibliotek dll? Możliwe, że dll java ładuje się w wyniku wywołania loadLibrary() wymaga innych bibliotek dll. W systemie Windows, wydaje mi się, że będzie wyglądać% PATH%, aby spróbować znaleźć te biblioteki DLL.

To nie jest ściśle rzecz biorąc java; ma to więcej wspólnego z natywną biblioteką, którą ładujesz. Java dowie się, gdzie znaleźć bibliotekę DLL za pośrednictwem java.library.path (lub jakiegokolwiek innego mechanizmu, którego używa Matlab), a libname.dll użyje% PATH%, aby znaleźć biblioteki DLL, od których zależy.

Jak powiedziałeś, że brakująca biblioteka dll znajduje się w twoim java.library.path, być może mógłbyś spróbować dołączyć wartość java.library.path do% PATH% i spróbować ponownie?

1

Put DLL, aby spróbować załadować używając java.lang.System.loadLibrary w następującym katalogu: $ matlabroot \ sys \ java \ jre \ wygrana ?? \ jre \ bin \

+0

Wow, to działało! Ale dlaczego działa to przy dodawaniu java.library.path? –

Powiązane problemy