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 :

java.lang.UnsatisfiedLinkError avec JNI


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut java.lang.UnsatisfiedLinkError avec JNI
    Bonjour,
    j'essaie de faire fonctionner un programme tout simple avec JNI sous Windows. J'arrive à compiler le programme et à produire le fichier .h et la dll, mais quand j'essaie à éxuter le programme, j'ai ce message d'erreur.

    Exception in thread "main" java.lang.UnsatisfiedLinkError: afficheCpp
    at Bonjour.afficheCpp(Native Method)
    at Bonjour.main(Bonjour.java:26)

    La partie Java de code fonctionne, mais pas la partie C++.
    Le code du programme java c'est

    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
    public class Bonjour {
     
        public native void afficheCpp();
     
        //chargement de la librairie c++ HelloWorld
        static {System.loadLibrary("HelloW"); }
     
     
     
        public static void main (String[] args)
        {
            System.out.println("coucou (en java)\n");
            new Bonjour().afficheCpp();       
        }
     
     
    }
    Le Programme C, c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <jni.h>
    #include "HelloW.h"
    #include <iostream>
    using namespace std;
     
    JNIEXPORT void JNICALL Java_Bonjour_afficheCpp (JNIEnv *env, jobject obj)
    {
    cout<<"Ich heisse Sonja ( en C++)"<<endl;
     
    }
    et le fichier .h, c'est

    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
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Bonjour */
     
    #ifndef _Included_Bonjour
    #define _Included_Bonjour
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class:     Bonjour
    * Method:    afficheCpp
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_Bonjour_afficheCpp
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    J'ai déjà essayé plein de choses, mais je ne sais plus quoi faire. Au début j'ai pensé qu'il ne trouve pas la dll, mais si j'efface la dll, j'ai un autre message d'erreur:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloW in java.lib
    rary.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at Bonjour.<clinit>(Bonjour.java:19)

    Le problème c'est plutôt que le java compiler ne trouve pas la fonctionne afficheCpp dans la .dll. Sur Linux le même programme fonctionne, mais je ne vois pas ce qu'il faut encore changer pour que cela marche.
    Si quelqu'un peux m'aider, ce serais super.
    Sonja

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    je pense que ca vient du fait que tu n'as pas le chemin de ta DLL dans le classpath .

    essais de rajouter ca dans le classpath:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <classpathentry excluding="chemin de ta dll"  path="">
    	<attributes>
    		<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="chemin de ta dll"/>
    	</attributes>
    </classpathentry>
    comme tu le vois je travail sous eclipse. si c'est pas ton cas le code peux changer un peu mais là je ne peux pas t'aider.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Je crois plutôt que c'est un problème qui vient du GNU compilateur, voir

    http://www.cygwin.com/ml/cygwin/1998-07/msg00008.html

    Mais je n'ai pas encore essayé le MS-Dos compilateur.
    Je vais quand même essayer à ajouter mon dll dans le classpath. Merci entre-temps.

  4. #4
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par <_oodTi96Tiboo_>
    je pense que ca vient du fait que tu n'as pas le chemin de ta DLL dans le classpath .
    Je pense plutôt qu'il faut simplement ajouter le directory contenant la dll dans la variable système PATH. Car la variable classpath, c'est pour les ressources java et path pour les ressources natives.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Mais il trouve la dll, il a juste un problème à lire la dll, ca veut dire à trouvé la méthode dans la dll

  6. #6
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Points : 98
    Points
    98
    Par défaut
    Oui alors ce serait bien un problème de compilation de la dll.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    J'ai eu le même problème et je l'ai résolu en ajoutant un fichier .def à passer au linker après la compilation C. Le fichier a cette tête là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    EXPORTS
    Java_Bonjour_afficheCpp
    Dans mon cas, le fichier était nécessaire sous Windows avec Cygwin, mais pas sur Unix.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    je ne suis pas sure, si j'ai bien compris quoi faire, comme cela ne marche pas. J'ai crée un fichier Bonjour.def avec le context

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXPORTS
    Java_Bonjour_afficheCpp
    et je l'ai laissé dans le même répertoire. Puis, après avoir fait la compilation de la dll (g++ -o HelloW.dll -shared -IC:\Java\jdk1.5.0_06\include -IC:\Java\jdk1.5.0_06\include\win32 HelloW.cpp)
    j'ai donné cette commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Sonja\jni\hello>ld Bonjour.def
    qui m'a donné ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cannot export Java_Bonjour_afficheCpp: symbol not defined
    ld: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000
    Tu sais pourquoi cela ne marche pas?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Je commence par générer des fichiers .o à partir des fichiers .c, puis je génère un fichier .dll à partir des .o et du .def.

    CF : tutoriel jmd chap 30 dans les cours et tutoriels Java : http://java.developpez.com/cours/

    Peut être cela peut-il marcher en ajoutant directement "Bonjour.def" dans ta ligne de compilation g++ ?

    En ce qui me concerne, je suis passé par un script Ant, histoire de compliquer un peu plus la chose .
    Donc je ne sais pas exactement quelles instructions de compilation écrire en ligne de commandes.

    La tâche Ant ressemble à cela, si cela peut t'aider :

    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
     
    <target name="compile" depends="prepare">
      <cc name="gcc" objdir="/target/o" outfile="target/malib.dll">
        <compiler name="gcc">
          <compilerarg value="-mno-cygwin" if="x86.compile" />
          <includepath>
            <path path="${jni.include}" />
            <path path="${jni.include}/${jni.platform}" />
            <path path="src/h" />
          </includepath>
          <fileset dir="src/c">
            <include name="*.c" />
            <include name="*.def" if="x86.compile" />
          </fileset>
        </compiler>
        <linker name="gcc">
          <linkerarg value="-mno-cygwin" if="x86.compile" />
          <linkerarg value="-shared" />
        </linker>
      </cc>
    </target>

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Enfin, cela a fonctionné!! Merci beaucoup!!
    J'ai juste ajouté le fichier Bonjour.def pour faire la dll:

    gcc -o Bonjour.dll -shared -IC:\Java\jdk1.5.0_06\include -IC:
    \Java\jdk1.5.0_06\include\win32 Bonjour.c Bonjour.def

  11. #11
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 083
    Points : 1 524
    Points
    1 524
    Billets dans le blog
    5
    Par défaut
    Bonjour

    J'ai exactement le même problème mais la solution ne semble pas fonctionner.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

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

Discussions similaires

  1. [JNI] - Eclipse "java.lang.UnsatisfiedLinkError"
    Par Pikouse dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 11/10/2010, 14h49
  2. Réponses: 6
    Dernier message: 22/10/2009, 12h17
  3. [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
  4. Réponses: 1
    Dernier message: 12/09/2007, 10h47
  5. [System.load] Exception java.lang.UnsatisfiedLinkError avec unknown file type
    Par jemini_fr dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 05/02/2007, 13h52

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