2009-04-17 26 views
7

Ho una libreria chiamata HelloWorld.so e un HelloWorld.java programma con questo contenuto:Perché sto ottenendo questo UnsatisfiedLinkError con codice nativo?

class HelloWorld { 
    private native void print(); 
    public static void main(String[] args) { 
     new HelloWorld().print(); 
    } 
    static { 
     System.loadLibrary("HelloWorld"); 
    } 
} 

Ora, quando provo a fare funzionare HelloWorld.java ottengo questo errore:

 
$ /usr/java1.4/bin/java HelloWorld 
Exception in thread "main" 
java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path 
     at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491) 
     at java.lang.Runtime.loadLibrary0(Runtime.java:788) 
     at java.lang.System.loadLibrary(System.java:834) 
     at HelloWorld.<clinit>(HelloWorld.java:7) 

Eventuali suggerimenti ?

+0

Se la vostra utilizzando Linux (Ubuntu terminale), quindi si prega di dare un'occhiata ai http://saurabhsharma123k.blogspot.in/2017 /07/java-jni-and-cc-from-command-line.html –

risposta

0

@mmyers Grazie per aver risposto. Abbiamo scoperto che tutto ciò che dovevamo fare era cambiare System.loadLibrary in System.load e passare il percorso completo + filename come argomento, funzionava come un incantesimo.

Anche prima di farlo, abbiamo provato a utilizzare il parametro "-D" e impostando LD_LIBRARY_PATH ma non ci sono riusciti.

Vai alla figura! :)

Grazie ancora, Karen

+0

Questo è estremamente strano. loadLibrary dovrebbe comportarsi in modo identico, tranne per il fatto che richiede che la libreria si trovi sul percorso. Questo è ciò che si suppone che -Djava.libary.path aiuti. –

+0

Non lo so ... Mi piacerebbe se un giorno qualcuno potesse spiegare :) – KNewton

+1

Non ha funzionato per me! –

7

Dove si trova HelloWorld.so? Probabilmente è necessario specificare la directory principale utilizzando il parametro della riga di comando "-Djava.library.path".

Ad esempio, se è in "/path/libs/HelloWorld.so", aggiungere -Djava.library.path=/path/libs come opzione quando si richiama java. Ad esempio, è "-Djava.library.path=lib" su uno dei miei progetti.

Modifica: Dan Dyer sottolinea che la variabile di ambiente LD_LIBRARY_PATH può essere utilizzata anche per questo.

+0

Anche l'estensione .so deve essere esplicitamente indicata? – Otis

+0

Modificato per chiarire (è in realtà il percorso della cartella contenente il file .so). –

+0

@erickson: Grazie, sembra migliore. –

8

ho avuto questo problema e risolto rinominando mia biblioteca a libHelloWorld.so e seguendo il suggerimento di Michael Myers. Sono su Arch Linux 64-bit.

HelloWorld.c:

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

/* shamelessly stolen from the book 'The Java Native Interface: Programmer's 
    Guide and Specification' */ 
JNIEXPORT void JNICALL 
Java_HelloWorld_print (JNIEnv *env, jobject obj) { 
    printf("Hello World!\n"); 
} 

HelloWorld.java:

class HelloWorld { 
    private native void print(); 
    public static void main(String[] args) { 
     new HelloWorld().print(); 
    } 
    static { 
     System.loadLibrary("HelloWorld"); 
    } 
} 

costruzione e collaudo:

$ javac HelloWorld.java 
$ javah -classpath . HelloWorld 
$ gcc -shared -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux HelloWorld.c -o libHelloWorld.so 
$ java -classpath . -Djava.library.path=. HelloWorld 
Hello World! 

tl; dr: mettono lib all'inizio del nome del file della biblioteca

+1

tl; dr mi ha appena salvato la giornata – serj

11

Credo che alcuni punti sono utili quando ottiene questo errore:

  1. verifica della coerenza del nome della funzione in file .c e generati file ( .h)
  2. Nome della biblioteca JNI basato su OS. Es: In HelloWorld.java, System.loadLibrary("HelloWorld");
    • Solaris: libHelloWorld.so
    • Linux: libHelloWorld.so
    • Win: HelloWorld.dll
    • Mac: libHelloWorld.jnilib
  3. Durante l'esecuzione, aggiungere -Djava.library.path=PATH. PATH al luogo dove si mette la libreria JNI

Ecco il mio riferimento: https://blogs.oracle.com/moonocean/entry/a_simple_example_of_jni

Problemi correlati