2009-04-17 6 views
7

J'ai une bibliothèque appelée HelloWorld.so et un HelloWorld.java de programme avec ce contenu:Pourquoi est-ce que je reçois ce UnsatisfiedLinkError avec du code natif?

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

Maintenant, quand je tente de lancer HelloWorld.java je reçois cette erreur:

 
$ /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) 

Tous les conseils ?

+0

Si votre utilisation de Linux (Ubuntu terminal), alors s'il vous plaît jeter un oeil sur http://saurabhsharma123k.blogspot.in/2017 /07/java-jni-and-cc-from-command-line.html –

Répondre

0

@mmyers Merci d'avoir répondu. Nous avons découvert que tout ce que nous avions à faire était de changer System.loadLibrary en System.load et de passer le chemin complet + filename en argument, fonctionnait comme un charme.

Même avant cela, nous avons essayé d'utiliser le paramètre "-D" et de définir LD_LIBRARY_PATH mais nous n'avons pas réussi.

Allez comprendre! :)

Merci encore, Karen

+0

C'est extrêmement étrange. loadLibrary devrait se comporter de manière identique, sauf qu'il nécessite que la bibliothèque soit sur le chemin. C'est ce que le -Djava.libary.path est censé aider. –

+0

Est-ce que je ne le sais pas .... Je l'adorerais si un jour quelqu'un pourrait expliquer :) – KNewton

+1

Ne travaillait pas pour moi! –

7

Où se trouve HelloWorld.so? Vous devez probablement spécifier son répertoire parent à l'aide du paramètre de ligne de commande "-Djava.library.path". Par exemple, si "/path/libs/HelloWorld.so" est ajouté, ajoutez -Djava.library.path=/path/libs comme option lors de l'appel de java. Par exemple, c'est "-Djava.library.path=lib" sur l'un de mes projets.

Editer: Dan Dyer souligne que la variable d'environnement LD_LIBRARY_PATH peut également être utilisée pour cela.

+0

Est-ce que l'extension .so doit aussi être explicitement indiquée? – Otis

+0

Edité pour clarifier (c'est en fait le chemin vers le dossier contenant le fichier .so). –

+0

@erickson: Merci, ça a l'air mieux. –

8

J'ai eu ce problème et résolu en renommant ma bibliothèque à libHelloWorld.so et suivant la suggestion de Michael Myers. Je suis sur Arch Linux 64 bits.

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

bâtiment et essais:

$ 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: mettre lib au début du nom de la bibliothèque

+1

tl; dr vient de sauver ma journée – serj

11

Je pense que certains points sont utiles lors de l'obtention de cette erreur:

  1. Vérifier la cohérence du nom de fonction dans fichiers .c et fichiers générés ( .h)
  2. Nom de la bibliothèque de JNI basé sur OS. Ex: Dans HelloWorld.java, System.loadLibrary("HelloWorld");
    • Solaris: libHelloWorld.so
    • Linux: libHelloWorld.so
    • Win: HelloWorld.dll
    • Mac: libHelloWorld.jnilib
  3. Lors de l'exécution, ajoutez -Djava.library.path=PATH. PATH pour placer où vous mettez votre bibliothèque JNI

Voici ma référence: https://blogs.oracle.com/moonocean/entry/a_simple_example_of_jni

Questions connexes