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 :

J'essaie d'utiliser JNI (Java Native Interface)


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut J'essaie d'utiliser JNI (Java Native Interface)
    Bonjour,

    J'ai un petit problème dont je n'arrive pas à sortir. Je suis sous Windows.

    J'ai une classe xxx.class que j'ai compilée et que j'ai placée dans un dossier. Dans le même dossier j'ai crée une dll (yyy.dll) qui contient mes fonctions natives écrites en C.

    Lorsque je lance :
    java xxx
    cela marche très bien, j'exécute bien mes fonctions natives.

    Maintenant si je place ma classe xxx dans un fichier jar et que je lance l'exécution par :
    java -cp .;monjar.jar monpackage.xxx

    j'obtiens le message

    java.lang.UnsatisfiedLinkError:

    A noter que le répertoire dans lequel se trouve ma dll fait partie du system path.

    Merci d'avance pour toute suggestion.

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    il ne faut pas se contenter de mettre la dll dans un répertoire, il faut aussi demander à la JVM de la charger.

    Tu trouvera ce qu'il te faut ici : L'interface java natif

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Oui merci, mais bien sûr elle est chargée :
    System.loadLibrary("malib");

    Comme je disais précédemment, le même test marche très bien lorsque la classe n'est pas dans un JAR mais ne marche plus lorsque cette classe est dans le JAR.

    Donc le problème est certainement une histoire de path (enfin je crois). Mais je ne vois pas.

    Encore merci. si tu as d'autres idées n'hésite pas.

    Citation Envoyé par Alkhan Voir le message
    bonjour,

    il ne faut pas se contenter de mettre la dll dans un répertoire, il faut aussi demander à la JVM de la charger.

    Tu trouvera ce qu'il te faut ici : L'interface java natif

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    ok, en fait cela est probablement dû au fait que le chemin de ta dll ne se trouve pas dans le java.library.path.

    Dans se cas deux possibilités :
    - soit tu ajoutes le chemin de la dll au java.library.path
    - soit tu ne fait pas un System.loadLibrary mais un System.load("chemin complete de la dll)

    pour plus de détails il y a se qu'il faut dans la FAQ.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    OK merci je vais essayer.

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

    Citation Envoyé par GérardMartinelli Voir le message
    java xxx
    ...
    java -cp .;monjar.jar monpackage.xxx
    C'est normal que la classe change de nom entre les deux ?

    a++

    PS : Et normalement pour lancer un jar on utilise l'option -jar et le Main-Class du manifest

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,



    C'est normal que la classe change de nom entre les deux ? Oui car dans le second cas, la classe xxx a été placée dans un répertoire du jar correspondant au package. En fait le problème vient peut-être de là ? Faut-il recréer le .h et regénérer la dll ?

    a++

    PS : Et normalement pour lancer un jar on utilise l'option -jar et le Main-Class du manifest. J'ai essayé mais c'est pareil.

  8. #8
    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 GérardMartinelli Voir le message
    Faut-il recréer le .h et regénérer la dll ?
    Oui

    De mémoire le nom de la méthode native correspond à quelque chose du style "Java_nomDuPackage_nomDeLaClasse_nomDeLaMethode".

    Donc si tu changes ta classes tu dois régénérer le fichier .h et donc modifier/recompiler ton code source natif...

    a++

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Oui

    De mémoire le nom de la méthode native correspond à quelque chose du style "Java_nomDuPackage_nomDeLaClasse_nomDeLaMethode".

    Donc si tu changes ta classes tu dois régénérer le fichier .h et donc modifier/recompiler ton code source natif...

    a++
    Je crois que tu as mis le point exactement où il faut. Merci je vais essayer.

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

Discussions similaires

  1. Comment remplacer du code Java (appelé par JNI) en C
    Par Ismet_Oran dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 06/05/2014, 10h09
  2. Java Native Interface ( JNI )
    Par oktykiller dans le forum EDI et Outils pour Java
    Réponses: 2
    Dernier message: 29/08/2013, 15h57
  3. java native interface
    Par jalam dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 22/03/2007, 21h42
  4. [JNI] Java ne trouve pas mes méthodes natives
    Par carotte31 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/06/2006, 22h47
  5. [JNI] Java Native Interface portable ?
    Par ionix dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 26/04/2006, 17h25

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