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] java.lang.UnsatisfiedLinkError lors de l'exécution du code java


Sujet :

Entrée/Sortie Java

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut [JNI] java.lang.UnsatisfiedLinkError lors de l'exécution du code java
    bonjour,

    j'ai suivi ce tutoriel pour créer mon projet JNI sous Netbeans. Cependant j'ai une exception java.lang.UnsatisfiedLinkError qui est levée lors de son exécution.

    Je ne vois pas où est mon erreur.
    J'ai placé dans le dossier DLL du projet java tous les fichiers créés par la compilation de la librairie :
    -HelloWorldNative.dll
    -libHelloWorldNative.a
    -libHelloWorldNative.def
    ainsi que le HelloWorldNative.h


    Mon code java :
    Code java : 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
    23
    24
    25
    26
    27
    28
    29
     
    package helloworld;
     
    public class Main
    {
        private native void nativePrint();
            try
            {
                System.load("C:\\Documents and Settings\\Mes documents\\" +
                    "Doc_Java\\HelloWorld\\dll\\HelloWorldNative.dll");
            }
            catch (UnsatisfiedLinkError e)
            {
                System.out.println("Err 1 " + e.getMessage());
            }
     
        public static void main(String[] args)
        {
            try
            {
                new Main().nativePrint();
            }
            catch (UnsatisfiedLinkError e)
            {
                System.out.println("Err 2 " + e.getMessage());
            }
        }
     
    }

    Mon code C. J'utilise Code::Block. Le fichier d'entête a été généré par javah
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <jni.h>
    #include <stdio.h>
    #include "HelloWorldNative.h"
     
    JNIEXPORT void JNICALL Java_helloworld_Main_nativePrint
        (JNIEnv *env, jobject obj)
    {
        printf("\nHello World from C\n");
    }

    Code c : 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 helloworld_Main */
     
    #ifndef _Included_helloworld_Main
    #define _Included_helloworld_Main
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     helloworld_Main
     * Method:    nativePrint
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_helloworld_Main_nativePrint
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif

  2. #2
    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,



    Supprimes le try/catch sur UnsatisfiedLinkError et indique nous le stacktrace complet...

    a++

  3. #3
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par Auteur Voir le message
    j'ai suivi ce tutoriel pour créer mon projet JNI sous Netbeans.
    <commentaire qui n'a rien à voir avec la question>
    la vache!: mettre comme ça un cheminom absolu propre à la machine et à la plateforme! Ils sont fatigués de la vie

    à mon, pas très humble, avis il vaudrait mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static {
    System.loadLibrary("HelloWorldNative");
    }
    et mettre en place l'environnement qui permet de trouver les librairies (comme le LD_LIBRARY_PATH sous UNIX).

    (bien entendu on a des codes natifs différents selon les plateformes mais je ne vois pas de raison pour faire un code Java aussi peu portable)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,
    Supprimes le try/catch sur UnsatisfiedLinkError et indique nous le stacktrace complet...

    a++
    Pas sûr que cela avance à grand chose
    Exception in thread "main" java.lang.UnsatisfiedLinkError: helloworld.Main.nativePrint()V
    at helloworld.Main.nativePrint(Native Method)
    at helloworld.Main.main(Main.java:37)
    Java Result: 1

    Citation Envoyé par professeur shadoko Voir le message
    <commentaire qui n'a rien à voir avec la question>
    la vache!: mettre comme ça un cheminom absolu propre à la machine et à la plateforme! Ils sont fatigués de la vie
    Pour l'instant ce problème ne se pose pas

  5. #5
    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
    Citation Envoyé par Auteur Voir le message
    Pas sûr que cela avance à grand chose
    Déjà cela permet de savoir que l'exception survient lors de l'appel de la méthode et non pas lors du chargement de la DLL.
    Et de toute manière tant qu'on ne la vois pas on ne peut pas savoir. Cela permet d'éviter de partir dans de mauvaises directions pour rien...



    Vérifies bien la manière dont tu compiles ton code natif (cf les options u compilateur de l'article) ainsi que l'architecture des fichiers généré et de ta JVM (32 ou 64 bits)

    a++

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    Je suis sur une machine 32 bits (Windows XP).
    J'utilise la toute dernière version de java (1.6 update 23).

    Le compilateur est GCC GNU Compiler.
    Pour ce qui est des options j'ai supprimé les options par défaut utilisées par Code::Blocks (-W -O) et la dépendance vers User32.
    J'ai recopié mot pour mot les options du tutoriel.

    J'ai également recompilé et exécuté le projet en mode administrateur car par défaut je n'ai pas des droits admin sur cette machine. Le résultat est le même.

    En pièce jointe le projet Code::Blocks.

  7. #7
    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
    Essayes de rajouter l'option -Wl,--kill-at lors de la génération de la DLL. J'avais eu des soucis sans cela...

    a++

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    Il y a déjà dans les options Wl
    -mno-cygwin -Wl,--add-stdcall-alias -shared -m32
    le --kill-at je le place à un endroit particulier ?

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. Réponses: 5
    Dernier message: 26/03/2014, 19h47
  3. java.lang.NullPointerException lors de l'exécution de la servlet
    Par fahmi.bedoui dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/01/2011, 12h09
  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