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] erreur java.lang.UnsatisfiedLinkError


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 42
    Points : 28
    Points
    28
    Par défaut [JNI] erreur java.lang.UnsatisfiedLinkError
    Bonjour à tous!

    Après de longue heures de recherche sur le net, je ne trouve pas de solution à mon problème, je viens donc vous demander votre aide

    Voila j'essaye de créer une class InterfaceAvecC qui appelle des fonctions C, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public class InterfaceAvecC {
     
    	static{
    			System.loadLibrary("InterfaceAvecC");
    	}
     
    	public static native String creerGraphe(int n);
     
     
     
    }
    J'ai donc fais les commandes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    javac InterfaceAvecC.java
    javah -jni InterfaceAvecC
    Pour créer un .h générré automatiquement, ce qui donne ceci:

    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
    17
    18
    19
    20
    21
    22
     
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class InterfaceAvecC */
     
    #ifndef _Included_InterfaceAvecC
    #define _Included_InterfaceAvecC
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     InterfaceAvecC
     * Method:    creerGraphe
     * Signature: (I)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_InterfaceAvecC_creerGraphe
      (JNIEnv *, jclass, jint);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    Je créé le .c correspondant:

    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
    17
    18
    19
    20
    21
     
    #include <stdlib.h>
    #include <string.h>
    #include "InterfaceAvecC.h"
     
     
    JNIEXPORT jstring JNICALL
    Java_InterfaceAvecC_creerGraphe (JNIEnv *env, jclass cl, jint ji) {
     
     
    /* traitement en C */
     
    char* res="bonjour";
     
    /* conversion du résultat en chaîne Java */
    jstring jres = (*env)->NewStringUTF(env, res);
    /* libération mémoire */
     
    return jres;
     
    }
    (Jint ne sert à rien pour l'instant).

    Alors après il se passe quelque chose de bizarre.
    Je veux compiler le InterfaceAvecC.c comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gcc  -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux -c InterfaceAvecC.c
     
    gcc -shared -o libInterfaceAvecC.so InterfaceAvecC.o
    J'ai un message d'erreur:

    gcc -shared -o libInterfaceAvecC.so InterfaceAvecC.o
    /usr/bin/ld: InterfaceAvecC.o: réadressage de R_X86_64_32S en vertu de «*.rodata*» ne peut être utilisé lors de la création d'un objet partagé; recompilez avec -fPIC
    InterfaceAvecC.o*: erreur lors de l'ajout de symboles*: Mauvaise valeur
    collect2: error: ld returned 1 exit status

    J'ai donc testé en compilant la première commande gcc avec -fPIC comme option et ça marche mais je ne sais pas pourquoi donc je précise au cas ou.

    Ensuite j'essaye de compiler mon petit programme de test en java:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Test {
     
     
    	public static void main(String[] args){       
     
    		String s=InterfaceAvecC.creerGraphe(11);
    		System.out.println(s);
     
    	}
     
    }
    Et j'ai une belle erreur:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no InterfaceAvecC in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at InterfaceAvecC.<clinit>(InterfaceAvecC.java:4)
    at Test.main(Test.java:6)
    Je précise que tous mes fichiers sont dans le même dossier (il ne l'étais pas avant mais ça ne change rien).

    Voila je vous dis un grand merci pour ceux qui auront le courage ou les connaissances nécéssaire pour m'aider

  2. #2
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 444
    Points : 4 563
    Points
    4 563
    Par défaut
    C'est parce que la librairie native n'est soit pas trouvée, soit c'est une de ses dépendances qui manque.

    Dans le cas présent c'est bien interfaceAvecC qui n'est pas trouvé.

    Tu peux faire un display de System.getenv("java.library.path") et vérifier que la librairie est bien dispo dans les chemins mentionnés

    Pour le chargement tu peux aussi utiliser System.load(chemin complet); dans le cas, pas besoin d'être dans le library.path
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Merci pour la réponse. J'ai oublié de préciser que je suis débutant en java.




    J'ai fait avec System.load(chemin absolu);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public class InterfaceAvecC {
     
    	static{
    			System.load("home/fuzier/Documents/hex2/src");
    	}
     
    	public static native String creerGraphe(int n);
     
     
     
    }
    cela me donne l'erreur:


    Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: home/fuzier/Documents/hex2/src/InterfaceAvecC
    at java.lang.Runtime.load0(Runtime.java:806)
    at java.lang.System.load(System.java:1086)
    at InterfaceAvecC.<clinit>(InterfaceAvecC.java:4)
    at Test.main(Test.java:6)


    Sinon j'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(System.getenv("java.library.path"));
    il affiche NULL....


    Que faire??

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Au temps pour moi j'ai mal rentré le chemin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public class InterfaceAvecC {
     
    	static{
    			System.load("/home/fuzier/Documents/hex2/src/InterfaceAvecC");
    	}
     
    	public static native String creerGraphe(int n);
     
     
     
    }
    Mais maintenant j'ai cette erreur:


    Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /home/fuzier/Documents/hex2/src/InterfaceAvecC
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1827)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at InterfaceAvecC.<clinit>(InterfaceAvecC.java:4)
    at Test.main(Test.java:6)



  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Nouveau rebondissement!!!

    ça marche si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public class InterfaceAvecC {
     
    	static{
    			System.load("/home/fuzier/Documents/hex2/src/libInterfaceAvecC.so");
    	}
     
    	public static native String creerGraphe();
     
     
     
    }

    Le probleme c'est que je vais devoir tester ce code sur des autres machines que la mienne donc ça ne resoud pas entierement mon probleme?

    Je suis a court d'idée....

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Fellowes Voir le message
    Le probleme c'est que je vais devoir tester ce code sur des autres machines que la mienne donc ça ne resoud pas entierement mon probleme?
    Bah, c'est là qu'il faut utiliser le paramètre library.path qui permet d'adapter la commande à l'environnement (donc à l'emplacement de la bibliothèque native), ou
    • éventuellement packager la bibliothèque dans le jar, la déployer dans un dossier temporaire, et la charger
    • ou alors gérer un path relatif à ton application,
    • ou avec un chemin qui dépend de l'utilisateur (avec System.getProperty("user.home")) mais qui obligera l'utilisateur à installer la bibliothèque au bon endroit
    • ou avec un paramètre quelconque à passer dans la ligne de commande (qui est le chemin d'accès de la bibliothèque).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Merci pour tes conseils, tout marche à peu près

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 HelloWorld java.lang.UnsatisfiedLinkError
    Par ®om dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 02/10/2012, 17h59
  4. [JNI] - Eclipse "java.lang.UnsatisfiedLinkError"
    Par Pikouse dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 11/10/2010, 14h49
  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