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 :

[Débutant][JNI]Erreur de chargement de dll


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut [Résolu][Débutant][JNI]Erreur de chargement de dll
    Le but est d'appeler une méthode C depuis une application Java. Pour cela, j'utilise JNI.

    J'ai la classe suivante en 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
    15
    16
    public class JNITest
    {
    public static void main(String[] args)
    	{
    	System.out.println("Avant"); // pour le debug
    	try
    		{
    		System.loadLibrary("JNITestC");
    		}
    	catch(Throwable exc)
    		{
    		exc.printStackTrace();
    		}
    	System.out.println("Après"); // pour le debug
    	}
    }
    Et j'ai le fichier JNITestC.c suivant, en C :

    #include <jni.h>
    #include "JNITest.h"
    #include <stdio.h>

    JNIEXPORT void JNICALL
    Java_JNITest_displayHelloWorld(JNIEnv *env, jobject obj)
    {
    printf("Hello world!\n");
    return;
    }
    Je compile tout sans aucun problème (je n'ai pas oublié le javah pour le fichier header du C), et quand je lance l'exécution, ca bloque et ca quitte au moment du System.loadLibrary. Je lis bel et bien le message "Avant", mais le programme me rend la main juste après, sans le moindre message d'erreur.
    Ce n'est pas un problème de path étant donné que si j'efface le dll, j'ai une UnsatisfiedLinkError.

    Je pense que c'est un problème de compilation. Je compile avec gcc (sorti de Cygwin) et j'ai essayé beaucoup de paramètres, entre autre "-mdll", "-shared" et certains autres dont je ne sais même pas à quoi ils servent.
    Quelqu'un aurait-il une idée ?
    Agifem, Auteur des Chroniques de l'Age Sombre
    Dans tout mensonge gît une part de vérité.

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 70
    Points : 162
    Points
    162
    Par défaut
    Salut,

    Tu as une methode bien etrange pour creer ton interface native.
    Peut-etre que ca marcherait comme tu le fais, mais il est preferable d'etre rigoureux :

    Declare dans ta clase java toutes tes methode native, ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public native void displayHelloWorld();
    ensuite genere ton fichier .h avec javah... Si tu ne declares pas tes methodes natives, javah ne peut pas creer l'entete correspondant.

    Ensuite tu compiles ton .c avec gcc.

    Il est recommande de charger la librairie dans un bloc static lors du chargement de la classe.

    Enfin comment veux tu tester ton interface native si tu n'appelles pas ta methode native??

    Enfin essaye de traiter les differents types d'exception et d'afficher le message associe (getMessage()).

    N'oublies pas que java recherche ta bibliotheque dans le library path, il faut le lui preciser au moment de l'execution soit avec la variable d'environnement LIBPATH, soit avec l'argument -Djava.library.path=.... dans la ligne de commande

    J'espere avoir pu t'aider.

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 70
    Points : 162
    Points
    162
    Par défaut
    Ah oui, j'utilises la JNI sous UNIX, je compile avec gcc et l'option -shared.

    Je ne sais pas ce qu'il en est sous windows.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai déjà fait tout cela, j'avais créé la méthode native dans le java, fait le loadlibrary dans la méthode static, mais j'avais à chaque fois la même erreur UnsatisfiedLinkError, disant qu'il chargait bien la dll, mais qu'il n'y trouvait pas la méthode.
    Après, j'ai essayé de compiler autrement, et c'est le chargement de la dll qui plantait, rendait la main sans le moindre lessage d'erreur (je fais des try catch partout sans succès).
    Je suis persuadé que c'est ma façon de compiler qui est incorrecte. J'ai compilé l'exemple de Sun sans succès.

    Citation Envoyé par iolco51
    Ensuite tu compiles ton .c avec gcc.
    C'est surtout sur cette partie là que j'ai besoin d'aide. J'utilise gcc, mais je ne connais pas les bonnes options à utiliser pour créer une dll dont les méthodes soient accessibles par java.
    En plus, les options dépendent énormément du compilateur qu'on utilise, et beaucoup de gens compilent sous unix/linux, alors trouver des infos sur la toile est un cauchemar.
    Est-ce que tu aurais l'adresse d'un compilateur à télécharger ainsi que la synthaxe précise de la ligne de commande pour ce compilateur, sachant que je suis bloqué sous windows
    Agifem, Auteur des Chroniques de l'Age Sombre
    Dans tout mensonge gît une part de vérité.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai finalement trouvé par moi même, au prix de trois jours de recherche sur internet.
    Pour ceux qui ont rencontré ce problème (que je ne souhaite à personne) voici la ligne de commande à utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -shared -Wl,--add-stdcall-alias -mno-cygwin -o JNITestC.dll JNITestC.c
    En fait, il fallait combiner le --add-stdcall-alias (dont je ne sais pas à quoi il sert) avec le -mno-cygwin parce que j'utilisais le gcc de Cygwin pour compiler une dll qui devait être indépendante de Cygwin.
    Merci malgré tout à Iolco pour le temps qu'il m'a consacré, et aux autres pour le temps qu'ils ont passé à me lire.
    Agifem, Auteur des Chroniques de l'Age Sombre
    Dans tout mensonge gît une part de vérité.

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

Discussions similaires

  1. [WM15] Erreur de chargement de dll
    Par courdi95 dans le forum Windev Mobile
    Réponses: 5
    Dernier message: 23/06/2010, 07h34
  2. erreur de chargement de DLL
    Par Acropole dans le forum Ogre
    Réponses: 2
    Dernier message: 16/07/2008, 07h24
  3. JNI - Problème de chargement de DLL
    Par indepthsight dans le forum C++
    Réponses: 1
    Dernier message: 30/11/2007, 10h19
  4. Erreur de chargement de DLL
    Par marceline dans le forum SAP Crystal Reports
    Réponses: 14
    Dernier message: 17/07/2006, 23h40
  5. Erreur de chargement de DLL
    Par marceline dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/07/2006, 10h40

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