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] Difficultés pour utiliser une DLL


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut [JNI] Difficultés pour utiliser une DLL
    Bonjour,

    je cherche désespérement à réaliser le tuto de sun sur jni:
    http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/step1.html
    J'ai crée le fichier source 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
     
    package jni;
     
    class HelloWorld {
        public native void displayHelloWorld();
     
        static {
            System.loadLibrary("hello");
        }
     
        public static void main(String[] args) {
            new HelloWorld().displayHelloWorld();
        }
    }
    Je l'ai compilé:
    d:\java\jni\java -classpath . HelloWorld.java
    J'ai crée le fichier header:
    d:\java\javah -classpath . jni.helloworld
    J'obtiens ainsi jni_helloworld.h.
    J'ai crée le fichier jni_helloworld.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <jni.h>
    #include "jni_HelloWorld.h"
    #include <stdio.h>
     
    JNIEXPORT void JNICALL 
    Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
    {
        printf("Hello world!\n");
        return;
    }
    Je l'ai compilé pour obtenir hello.dll

    J'exécute:
    d:\java\java -classpath . jni.helloworld
    et j'obtiens le message :

    java.lang.UnsatisfiedLinkError: no hello in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)
    at java.lang.Runtime.loadLibrary0(Runtime.java:788)
    at java.lang.System.loadLibrary(System.java:834)
    at jni.HelloWorld.<clinit>(HelloWorld.java:7)
    Exception in thread "main"
    Java Result: 1
    Merci pour votre aide.
    Parce que ça fait un moment que je cherche et pas moyen de réussir.
    Ciao.

  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,


    Cela signifie qu'il ne trouve pas la DLL...
    Elle doit se trouver dans un des répertoires de la propriété java.library.path.
    En général, c'est dans les répertoires du système (Windows\System32 par exemple) ou le répertoire courant...

    Vérifie bien le nom "hello.dll". Sinon affiche la valeur de java.library.path pour être sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.out.println ( System.getProperty("java.library.path") );
    a++

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Salut,

    oui ma dll s'appelle bien hello.dll
    Je l'ai placé dans c:\windows\system32 et maintenant à l'execution du fichier, j'ai le message d'erreur suivant:

    java.lang.UnsatisfiedLinkError: displayHelloWorld
    at jni.HelloWorld.displayHelloWorld(Native Method)
    at jni.HelloWorld.main(HelloWorld.java:11)
    Exception in thread "main"
    Java Result: 1
    J'ai vérifié, et les noms des méthodes sont bien les même.

    ++

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    Salut,
    J'ai un souci du même ordre avec une librairie qui se trouve pourtant bien dans java.library.path. En fait ça marche bien quand j'execute directement dans le compilateur mais pas avec mon .exe qui se trouve dans le même répertoire.
    Quelqu'un saurait-il pourquoi l'exe ne trouve pas la dll qui se trouve toujours au même endroit?

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    j"ai essayé pas mal de choses mais j'ai toujours cette erreur.
    Il semblerait qu'il ne trouve pas les méthodes natives.
    C curieux.

    Merci de votre aide.
    Ciao.

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Il se peut que l'erreur soit due à un problème de chasse de caractères, peux-tu aussi poster le contenu de ton fichier .h ?
    K

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    voici mon fichier .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
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class jni_HelloWorld */
     
    #ifndef _Included_jni_HelloWorld
    #define _Included_jni_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     jni_HelloWorld
     * Method:    displayHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_jni_HelloWorld_displayHelloWorld
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    Ciao et merci

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Ton problème vient du package jni de ton exemple.

    En regardant ton .h on voit que ( contrairement à la doc ) ta signature n'est pas bonne. La fonction appellée en C ne devrait pas avoir jni dans sa signature.

    Ca doit être dû au moment ou tu as utilisé javah, je n'ai pas l'impression qu'il soit necessaire de préciser alors le package, juste le fichier suffit. Mais je ne suis pas sûr
    K

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Bonsoir,

    j'ai recompilé le fichier .h par la commande suivante:

    d:\java\jni\javah -classpath . jni.helloworld
    Ainsi le fichier .h est désormais:

    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 HelloWorld */
     
    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    displayHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    J'ai recompilé la dll.

    J'ai réexécuté, mais j'ai toujours l'erreur suivante:

    java.lang.UnsatisfiedLinkError: displayHelloWorld
    at jni.HelloWorld.displayHelloWorld(Native Method)
    at jni.HelloWorld.main(HelloWorld.java:11)
    Exception in thread "main"
    Java Result: 1
    Merci pour votre aide.
    Ciao

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    En fait autant pour moi.
    Ta méthode pour créer le header était correcte au départ ( je viens de tester ).

    En fait tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    javah jni.helloworld
    Ton problème au départ était au niveau de la définition de ta méthode dans ton fichier C, il manquait la partie "jni" dans le nom. Voila la bonne version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <jni.h>
    #include "jni_HelloWorld.h"
    #include <stdio.h>
     
    JNIEXPORT void JNICALL
    Java_jni_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
    {
        printf("Hello world!\n");
        return;
    }
    Avec ça, ça devrait fonctionner !
    K

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    en fait même sans ça, cela fonctionne.

    Merci encore.
    ++

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

Discussions similaires

  1. Aide pour utiliser une DLL C++ dans D7
    Par ESQUIRO dans le forum Langage
    Réponses: 1
    Dernier message: 15/02/2012, 01h28
  2. [WD14] Utiliser une dll monter pour C/C++
    Par devalender dans le forum WinDev
    Réponses: 2
    Dernier message: 16/08/2011, 12h06
  3. Technologie pour service web utilisant une dll C
    Par lolinette dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 09/02/2007, 08h13
  4. Réponses: 1
    Dernier message: 18/07/2006, 16h44
  5. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 14h01

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