IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

JNI HelloWorld java.lang.UnsatisfiedLinkError


Sujet :

Entrée/Sortie Java

  1. #1
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut JNI HelloWorld java.lang.UnsatisfiedLinkError
    Bonjour,

    Je souhaite écrire un HelloWorld pour JNI, mais celui-ci ne fonctionne pas.

    Voici l'arborescence de mon projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .
    +-- bin
    |   `-- test
    |       `-- TestJNI.class
    +-- native
    |   +-- testjni.so
    |   +-- test_TestJNI.c
    |   +-- test_TestJNI.h
    |   `-- test_TestJNI.o
    `-- src
        `-- test
            `-- TestJNI.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ cat src/test/TestJNI.java 
    package test;
     
    public class TestJNI {
     
    	static {
    		System.loadLibrary("testjni");
    	}
     
    	public static native void helloWorld();
     
    	public static void main(String... args) {
    		helloWorld();
    	}
     
    }
    J'ai généré test_TestJNI.h grâce à la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javah -classpath bin -d native test.TestJNI
    J'ai écrit mon fichier .c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat native/test_TestJNI.c
    #include <jni.h>
    #include <stdio.h>
    #include "test_TestJNI.h"
     
    JNIEXPORT void JNICALL Java_test_TestJNI_helloWorld(JNIEnv * env, jclass class) {
    	printf("Hello world !\n");
    }
    J'ai ensuite généré mon .so :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cd native
    $ gcc -fPIC -c test_TestJNI.c -o test_TestJNI.o -I/usr/lib/jvm/java-6-openjdk-amd64/include
    $ gcc -shared -o testjni.so test_TestJNI.o
    $ cd ..
    J'ai besoin de -fPIC car mon système est une 64bits, sans quoi j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
    Donc à partir de là j'ai mon .so.

    Je tente ensuite d'exécuter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ java -Djava.library.path=native -cp bin test.TestJNI
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no testjni in java.library.path
    	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
    	at java.lang.Runtime.loadLibrary0(Runtime.java:840)
    	at java.lang.System.loadLibrary(System.java:1047)
    	at test.TestJNI.<clinit>(TestJNI.java:6)
    Même problème avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ java -Djava.library.path="$PWD/native"
    (ou si je déplace mon .so à la racine du projet et que j'utilise -Djava.library.path=.)

    Si je remplace dans TestJNI.java la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.loadLibrary("testjni");
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.load("/home/rom/java/TestJNI/native/testjni.so");
    alors ça fonctionne.

    Qu'ai-je mal fait ?

    Merci de votre aide.

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    J'ai trouvé !

    Si on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.loadLibrary("testjni");
    alors le fichier doit s'appeler libtestjni.so, et non testjni.so.


  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Plus précisément il faut respecter les conventions de nommage de l'OS hôte.
    Ainsi sous Unix/Linux la librairie "test" devra être compilé dans un fichier libtest.so, alors que sous Windows ce sera plutôt test.dll...


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. java.lang.UnsatisfiedLinkError avec JNI
    Par sonjaja dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/06/2017, 11h12
  2. JNI et java.lang.UnsatisfiedLinkError - Renommer un package
    Par albert55 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 28/11/2014, 13h58
  3. [JNI] - Eclipse "java.lang.UnsatisfiedLinkError"
    Par Pikouse dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 11/10/2010, 14h49
  4. [JNI] Problème SWIG java.lang.UnsatisfiedLinkError
    Par Julien.M dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/09/2007, 16h15
  5. Réponses: 1
    Dernier message: 12/09/2007, 10h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo