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ę?
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
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? –