2011-09-02 8 views
7

Widziałem to pytanie tutaj, próbowałem proponowanych poprawek, ale jak dotąd nie udało mi się osiągnąć żadnego sukcesu. Mam sporo doświadczenia z Javą, ale JNI jest dawno temu, nigdy nie robiłem tego na Linuksie ...Wydanie JNI w systemie Linux: nie można otworzyć pliku udostępnionego obiektu

Próbuję uzyskać prostą aplikację JNI HelloWorld działającą pod Linuksem.

mały plik Java:

class HelloWorld { 

    private native void print(); 

    public static void main(String[] args){ 
     new HelloWorld().print(); 
    } 

    static { 
     System.out.println(System.getProperty("java.library.path")); 
     System.loadLibrary("HelloWorld"); 
    } 

} 

Mały C file:

#include <jni.h> 
#include <stdio.h> 
#include "HelloWorld.h" 

JNIEXPORT void JNICALL 
Java_HelloWorld_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello World!\n"); 
    return; 
} 

skompilowany plik C przez:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so 

Uruchom aplikację przez:

java HelloWorld 

lub

java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld 

Ale no dobra, coraz:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory 

Dziwne, bo nie jest w rzeczywistości plik /home/nxp40954/jnitesting/libHelloWorld.so.

Czy ktoś ma jakąś wskazówkę?

Odpowiedz

7

wykonać w ten sposób:

export LD_LIBRARY_PATH=. 
java HelloWorld 

java.lang.UnsatisfiedLinkError jest generowany, gdy plik .so nie może być załadowany. Zmienna LD_LIBRARY_PATH wskazuje dodatkową lokalizację, aby wyszukać pliki * .so.

Jestem na 32-bitowym ubuntu z Sun Java. Kompilowałem w ten sposób:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -o libHelloWorld.so 
+0

Tak, wiem, że biblioteki powinny przejść ścieżkę zdefiniowaną przez LD_LIBRARY_PATH, "." również tam jest, a nawet używając opcji -Djava.library.path =/home/nxp40954/jnitesting, jawnie definiuję, gdzie znajduje się libHelloWorld.so, ale nadal otrzymuję komunikat "Brak takiego pliku lub katalogu". – Vlemmix

+0

Skompilowałem twój kod i działa on dla mnie. Czy możesz spróbować zrobić to wszystko w jednym katalogu i użyć "." ? BTW, jakiego używasz java? Waht OS? –

4

Twój przykład przydał mi się w 32-bitowej instalacji Linuksa.

Czy Twoja biblioteka współdzielona jest skompilowana jako 32-bitowa lub 64-bitowa biblioteka współdzielona? Sprawdź za pomocą komendy file libHelloWorld.so. Jeśli twoja biblioteka współużytkowana jest 64-bitowa, musisz podać opcję wiersza polecenia -d64 podczas uruchamiania Java, aby Java mogła załadować 64-bitową bibliotekę współdzieloną.

Jeśli twoja biblioteka współużytkowana jest 32-bitowa, być może opcja Java -d32 rozwiąże problem.

+0

Dzięki człowieku! Powinienem się nad tym zastanowić. Brak obsługi 64-bitowego JVM, ale lib był 64-bitowy. Dodano parametr -m32 do gcc, wszystko ok nie. Dzięki! – Vlemmix

+1

W przypadku braku szansy, to nie działa tak jak ja, upewnij się, że podałeś zmienną środowiskową 'LD_LIBRARY_PATH', zgodnie z odpowiedzią Michała, zamiast" java.library.path "Javy. Dzieje się tak dlatego, że jeśli biblioteka połączona potrzebuje dostępu do innej połączonej biblioteki, nie będzie mogła jej znaleźć, ponieważ nie wie o 'java.library.path'. –