2011-09-02 13 views
7

Ho visto questa domanda qui, ho provato le correzioni proposte, ma finora non ho avuto successo. Ho un bel po 'di esperienza in Java, ma JNI è molto tempo fa, non l'ho mai fatto su Linux ...Problema JNI su Linux: impossibile aprire il file oggetto condiviso

Sto provando a ottenere una semplice app HelloWorld JNI in esecuzione su Linux.

File di piccole 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"); 
    } 

} 

Piccolo file C:

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

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

compilato il file C da:

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

eseguire l'applicazione da:

java HelloWorld 

o

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

Ma non va bene, ottenendo un:

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 

Strano, perché non v'è in realtà un file /home/nxp40954/jnitesting/libHelloWorld.so.

Qualcuno ha un indizio?

risposta

7

eseguire in questo modo:

export LD_LIBRARY_PATH=. 
java HelloWorld 

Il java.lang.UnsatisfiedLinkError viene generata quando il file .so non può essere caricato. La variabile LD_LIBRARY_PATH punta alla posizione aggiuntiva per cercare i file * .so.

Sono su ubuntu 32bit con sun java. Stavo compilando in questo modo:

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

Sì, so che le librerie dovrebbero seguire il percorso definito da LD_LIBRARY_PATH, "." è anche lì, e anche usando -Djava.library.path =/home/nxp40954/jnitesting definisco esplicitamente dove si trova libHelloWorld.so, ma ottengo ancora questo errore "Nessun file o directory". – Vlemmix

+0

Ho compilato il tuo codice e funziona per me. Puoi provare a fare tutto in una directory e usare "." ? A proposito, che java stai usando? OS OS? –

4

L'esempio ha funzionato per me su un'installazione Linux a 32 bit.

La libreria condivisa è stata compilata come libreria condivisa a 32 o 64 bit? Verificare con il comando file libHelloWorld.so. Se la libreria condivisa è a 64 bit, è necessario fornire l'opzione da riga di comando -d64 all'avvio di Java in modo che Java possa caricare la libreria condivisa a 64 bit.

Se la libreria condivisa è a 32 bit, forse l'opzione Java -d32 risolverà il problema.

+0

Grazie amico! Avrei dovuto pensarci. Nessun supporto JVM a 64 bit, ma la lib era a 64 bit. Aggiunto il parametro -m32 a gcc, tutto ok no. Grazie! – Vlemmix

+1

Nella remota possibilità che ciò non funzioni per voi come me, assicuratevi di specificare la variabile di ambiente 'LD_LIBRARY_PATH' come per la risposta di Michal invece di' java.library.path' di Java. Questo perché se la tua biblioteca collegata ha bisogno di accedere ad un'altra libreria collegata non sarà in grado di trovarla poiché non sa di 'java.library.path'. –

Problemi correlati