2012-02-17 20 views
5

Małe tło: Mam aplikację java, która musi rozmawiać ze sprzętem innej firmy na mac. Dali mi SDK, ale nie jest to w Javie. Tak próbuję zrobić jnilib, który będzie działać jako pomost między moją aplikacją java i SDK.Mac + jni + java

Emisja: Zrobiłem małą próbkę jnilib który mówi do SDK, ale gdy próbuję go używać w moim programie java otrzymuję następujący błąd

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Users/john.doe/Desktop/eclipse/workspace/Lesson13_Jni_Smart7/bin/libSmartTest7.jnilib: Library not loaded: build/Release/SMARTResponseSDK.framework/Versions/A/SMARTResponseSDK Referenced from: /Users/john.doe/Desktop/eclipse/workspace/Lesson13_Jni_Smart7/bin/libSmartTest7.jnilib  
Reason: image not found 
    at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1827) 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1742) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1045) 
    at com.learning.lesson13.JniSmart7.<clinit>(JniSmart7.java:6) 

od błędu wygląda jak mój libSmartTest7.jnilib szuka biblioteki SMARTResponseSDK.

Co próbowałem Wiem, gdzie jest biblioteka SMARTResponseSDK na moim Macu. Próbowałem skopiować go do mojego folderu roboczego w czasie zaćmienia, ale nadal dostaję błąd. Próbowałem używać -DJava.library.path, ale nadal dostaję błąd.

Wszelkie pomysły na temat najlepszego możliwego podejścia.

+0

Na OSX biblioteka musi znajdować się wewnątrz zmiennej java.library.path lub DYLD_LIBRARY_PATH. Powinieneś również sprawdzić swoją bibliotekę, aby upewnić się, że nie używa ona określonej ścieżki bezwzględnej dla biblioteki zależnej (chyba, że ​​znajduje się w lokalizacji zainstalowanej na systemie). – technomage

+0

Witam Dziękuję za Twój komentarz. Przykro mi, ale wygląda na to, że to był mój błąd. Były dwie biblioteki "SMARTResponseSDK". wygląda na to, że użyłem niewłaściwego podczas budowania mojego jnilib. Użyłem innego "SMARTResponseSDK" i problem wydaje się być wyczyszczony. – user1216750

+0

Możesz także rozważyć Rococoa, które pozwala uniknąć pisania natywnego kodu i dostępu do biblioteki innej firmy bezpośrednio z Javy. – technomage

Odpowiedz

0

Po wpisaniu kodu JNI nie ma już znaczenia, na co wskazuje java.library.path.

Gdy jesteś wewnątrz kodu JNI, wszystko, co można zrobić, to upewnić się, że biblioteka jest widoczny w kodzie poprzez LD_LIBRARY_PATH/DYLD_LIBRARY_PATH, czy można dynamicznie załadować plik biblioteki z dowolnego miejsca chcesz.

Tak, dla ciebie, proponuję spojrzeć tutaj:

Można również korzystać z flag kompilacji podczas budowania biblioteki JNI i używać rpath.