2011-09-02 13 views
7

He visto esta pregunta aquí, intenté las soluciones propuestas, pero hasta ahora no he tenido éxito. Tengo bastante experiencia en Java, pero JNI hace mucho tiempo, nunca lo hizo en Linux ...Problema de JNI en Linux: no se puede abrir el archivo de objeto compartido

Estoy tratando de ejecutar una aplicación HelloWorld JNI simple en Linux.

pequeño archivo de 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"); 
    } 

} 

pequeño archivo 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; 
} 

compiló el archivo C por:

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

ejecutar la aplicación por:

java HelloWorld 

o

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

Pero no es bueno, para conseguir una:

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 

extraño, porque no es en realidad un archivo /home/nxp40954/jnitesting/libHelloWorld.so.

¿Alguien tiene una pista?

Respuesta

7

ejecutar esta manera:

export LD_LIBRARY_PATH=. 
java HelloWorld 

El java.lang.UnsatisfiedLinkError se inicia cuando el archivo .so no se puede cargar. La variable LD_LIBRARY_PATH señala una ubicación adicional para buscar los archivos * .so.

Estoy en 32bit ubuntu con sun java. Estaba compilando de esta manera:

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í, sé que libs debería seguir la ruta definida por LD_LIBRARY_PATH, "." también está ahí, e incluso al usar el archivo -Djava.library.path =/home/nxp40954/jnitesting defino explícitamente dónde se encuentra el libHelloWorld.so, pero sigo teniendo el error "No existe ese archivo o directorio". – Vlemmix

+0

He compilado tu código y funciona para mí. ¿Puedes intentar hacerlo todo en un directorio y usar "." ? Por cierto, ¿qué java estás usando? Waht OS? –

4

Su ejemplo funcionó para mí en una instalación de Linux de 32 bits.

¿Su biblioteca compartida está compilada como una biblioteca compartida de 32 o 64 bits? Verifique con el comando file libHelloWorld.so. Si su biblioteca compartida es de 64 bits, debe dar la opción de línea de comando -d64 al iniciar Java para que Java pueda cargar la biblioteca compartida de 64 bits.

Si su biblioteca compartida es de 32 bits, tal vez la opción de Java -d32 resolverá el problema.

+0

Gracias hombre! Debería haber pensado sobre eso. No hay compatibilidad con JVM de 64 bits, pero la lib era de 64 bits. Se agregó el parámetro -m32 a gcc, todo está bien no. ¡Gracias! – Vlemmix

+1

Si esto no funciona para ti, asegúrate de especificar la variable de entorno 'LD_LIBRARY_PATH' según la respuesta de Michal en lugar de' java.library.path' de Java. Esto se debe a que si su biblioteca vinculada necesita acceder a otra biblioteca vinculada, no podrá encontrarla, ya que no conoce 'java.library.path'. –

Cuestiones relacionadas