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

Eclipse Java Discussion :

[JNI] Problème à l'exécution


Sujet :

Eclipse Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut [JNI] Problème à l'exécution
    Bonjour,

    j'ai un problème sous eclipse lorsque je lance mon application java. Je suis en train de tester la JNI. J'ai suivi un exemple tout marche bien sauf lorsque que je lance l'application avec Eclipse ou sous la console MS DOS Windows. Pourtant j'ai bien créé la dll pour la JNI. J'ai commencé par faire un fichier Message.java que j'ai compilé. Puis j'ai créé le header "Message.h" à l'aide de javah. Ensuite j'ai compilé le fichier "Message.c" pour créer la dll "Message.dll". Et enfin j'ai écrit, compilé et exécuté le fichier "Test.java".

    Je ne savais pas trop ou mettre mon message donc je l'ai mis ici. Désolé si c'est pas au bon endroit.

    Si quelqu'un peut m'aider pour ce problème, je lui en serai très reconnaissant.
    Merci d'avance.

    Je vous mets dans la suite du message mes fichiers sources.

    Voici l'erreur que j'ai avec Eclipse :
    java.lang.UnsatisfiedLinkError: afficherMessage
    at Message.afficherMessage(Native Method)
    at Test.main(Test.java:7)

    Voici l'erreur que j'ai quand je passe sous la console :
    Exception in thread "main" java.lang.UnsatisfiedLinkError: afficherMessage
    at Message.afficherMessage(Native Method)
    at Test.main(Test.java:7)

    Message.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Message
    {
    	// Declaration d'une methode native
    	public native void afficherMessage();
     
    	// Chargement de la librairie dynamique
    	static{System.loadLibrary("Message");}
     
    }
    Message.h :
    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 Message */
     
    #ifndef _Included_Message
    #define _Included_Message
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     Message
     * Method:    afficherMessage
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_Message_afficherMessage
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    Message.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include "Message.h"
     
    JNIEXPORT void JNICALL Java_Message_afficherMessage(JNIEnv *env, jobject obj)
    {
        printf("Bonjour\n");
    }
    Test.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Test
    {
    	public static void main(String[] args)
    	{
    		Message m = new Message();
    		m.afficherMessage();
    	}
    }


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre chevronné Avatar de Jean-Philippe Shields
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2005
    Messages : 278
    Par défaut
    Il pourrait y avoir 2 problèmes:

    A) la machine virtuelle de java n'est pas capable de trouver ta dll si elle est bien compilée. Pour déterminer si c'est ce problème, met ta dll dans le même répertoire que javaw.exe sur ton ordi (habirullement dans le répertoire bin de ton jre).

    B) ta classe Message fait partie d'un package (que tu n'as pas mis dans l'exemple en pensant que ce n'est pas important, mais ça l'est). Si c'est le cas la définition de la méthode JNI doit aussi comporter le nom du package


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package group;
     
    public class Message 
    { 
       // Declaration d'une methode native 
       public native void afficherMessage(); 
     
       // Chargement de la librairie dynamique 
       static{System.loadLibrary("Message");} 
     
    }
    ta méthode JNI doit ressembler à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JNIEXPORT void JNICALL Java_group_Message_afficherMessage 
      (JNIEnv *, jobject);
    essaie ça pour voir.

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut
    Merci pour ton aide.
    Malheureusement cela ne marche pas.
    Pour le fichier dll, je l'ai mis dans le répertoire où se trouve "javaw.exe" et j'ai toujours la même erreur.
    Et pour le package, tous mes fichiers (Message.c, Message.h, Message.java, Test.java) sont dans le même répertoire.
    Donc je ne comprends pas, je suis toujours bloqué.

  4. #4
    Membre chevronné Avatar de Jean-Philippe Shields
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2005
    Messages : 278
    Par défaut
    Dans ce cas, je ne sais pas quoi te dire non plus. Tu devrais peut-être essayer de voir si javaw.exe load effectivement ta dll "Message.dll" en le débogant dans ton outil de développement C++. Comme ça tu pourrais savoir si javaw.exe trouve ta dll ou pas ou si le problème se situe dans la résolution du nom de ta fonction (s'il trouve bien ta dll).

  5. #5
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Salut,

    Citation Envoyé par Guldin
    Pour le fichier dll, je l'ai mis dans le répertoire où se trouve "javaw.exe" et j'ai toujours la même erreur.
    Euh... c'est pas dans le répertoire du fichier class qu'il faudrait mettre la dll plutôt?
    Sinon, pas d'erreur pour ma part.
    Il y a peut-être quelque chose dans ta procédure...

    Tu n'en as pas parlé dans ton premier post, mais... tu as bien créé un fichier Message.def pour exporter les procédures de la dll?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    EXPORTS
    Java_Message_afficherMessage
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -shared -o Message.dll Message.c Message.def
    ?

    Parce que bon, bizarrement, si j'oublie ce fichier def, j'obtiens la même erreur que toi...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  6. #6
    Membre averti
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut
    Bonjour,
    Encore merci pour votre aide.
    J'ai suivi vos conseils et cela ne marche toujours pas désolé

    Pour plegat :
    Tout d'abord, tous mes fichiers sont dans le même répertoire. Ensuite lorsque je compile le fichier Message.c pour créer la dll, Le programme CodeBlocks me crée 3 fichiers (Message.dll, libMessage.a et libMessage.def).
    Sinon j'ai essayé de compiler la dll en passant par la console mais je n'y arrive pas.
    La ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -shared -o Message.dll Message.c Message.def
    ne marche pas chez moi.
    Ma ligne de commande est comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -shared -IC:\j2sdk1.4.2_10\include -IC:\j2sdk1.4.2_10\include\win32 -o Message.dll Message.c Message.def
    J'ai l'erreur suivante qui s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc: Message.def: No such file or directory
    Donc je ne sais pas comment créer le fichier "Message.def".
    J'ai une question. Où est-ce que vous mettez le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXPORTS
    Java_Message_afficherMessage
    Merci d'avance.


    Pour Jean-Philippe Shields :
    Je ne sais pas comment déboger une application executable. Pourriez vous me dire comment ca marche s'il te plait? Je n'ai jamais fait cela. J'utilise CodeBlocks comme programme.
    J'ai testé tous ces fichiers sous linux et ils marchent sans problème alors que sous windows, je suis bloqué.
    Merci d'avance.

  7. #7
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Citation Envoyé par Guldin
    Tout d'abord, tous mes fichiers sont dans le même répertoire. Ensuite lorsque je compile le fichier Message.c pour créer la dll, Le programme CodeBlocks me crée 3 fichiers (Message.dll, libMessage.a et libMessage.def).
    Que te met-il dans le fichier libMessage.def?

    Citation Envoyé par Guldin
    La ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -shared -o Message.dll Message.c Message.def
    ne marche pas chez moi.
    Ca veut dire quoi "ne marche pas"?
    Elle rampe?
    Elle renvoie un message d'erreur? Lequel? Ne serait-ce point "gcc n'est pas reconnu en tant que commande interne"?

    Citation Envoyé par Guldin
    J'ai l'erreur suivante qui s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc: Message.def: No such file or directory
    Euh... tu as dit que Code::Blocks te générait un fichier libMessage.def... donc il faut mettre le bon nom de fichier... quand même...

    Citation Envoyé par Guldin
    Donc je ne sais pas comment créer le fichier "Message.def".
    J'ai une question. Où est-ce que vous mettez le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXPORTS
    Java_Message_afficherMessage
    Dans un nouveau fichier texte, que tu renommes Message.def...

    Au cas où, je te donne un lien pour un tutoriel java et eclipse : http://java.developpez.com/cours/ ... à moins que tu ne l'aies déjà parcouru...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    Membre averti
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut
    Merci pour votre aide précieuse.

    Ca marche.

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

Discussions similaires

  1. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34
  2. Problème d'exécution : 'rtl60.bpl introuvable'
    Par zeddy23 dans le forum EDI
    Réponses: 3
    Dernier message: 27/07/2005, 20h44
  3. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  4. [JNI]problème option -Djava.library.path
    Par sylviiie dans le forum ANT
    Réponses: 2
    Dernier message: 18/05/2004, 08h54
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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