Java dll problème

peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007 - 22 mai 2007 à 16:02
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 23 mai 2007 à 17:01
 bonjour a tous,

j'ai un gros souci car je dois lire des dll à partir de java. j'ai
essayé les methodes natives en utilisant le System.loadLibrary(madll);
mais celle me retourne une erreur que je n'arrive pas a comprendre de
ce type :"java.lang.UnsatisfiedLinkError"

Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Essai.CPS_IntroductionCarte()V
    at test.Essai.CPS_IntroductionCarte(Native Method)
    at test.Essai.main(Essai.java:20)


"madll" que j'utilise est une dll que l'on ma passé et qui contient des méthodes ou je connais que le nom. je n'est pas le .h


je ne sais pas comment faire :

public class Essai
{
    public native void CPS_IntroductionCarte();
    static
    {
        System.loadLibrary("cpsw32");
    }
      public static void main(String[] args)
      {               
          new Essai().CPS_IntroductionCarte();
      }
}

merci

13 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
22 mai 2007 à 16:23
Salut,

pense à mettre la dll dans le path des libraires pour ce faire tu à 3 solutions :
1 mettre la dll dans le system32 de windows
2 redef la variable LD_LIBRARY_PATH et y mettre le chemin de la dll dedans
3 le mettre directement dans la ligne de lancement ex :
java -Djava.library.path=./lib ...
(ici on concidere que la lib se trouve dans le repertoire lib de ton application)

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007
22 mai 2007 à 16:36
je viens de la copier dans system32 mais ceci n'a rien changé (Faut il que je redemarre?)
pour la LD_LIBRARY_PATH elle est utilisé que sous linux non?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
22 mai 2007 à 16:42
Salut,

je sais plus pour windows et LD_LIBRARY_PATH ....
essai plustot la solution 3 sur elle ne demande pas un reboot du pc, parce que pour les dll dans system32 je sais plus si faut reboot....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007
22 mai 2007 à 16:51
salut alor la je viens de tester en mettant un nom de librairie inconnue :
et il me retourne pas la meme erreur, je pense que ca veut dire qu il la charge mais il n'appelle pas la méthode :
voici l erreur retourné lors de l'appel d'une lib inconnue :

java.lang.UnsatisfiedLinkError: no toto in java.library.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at test.Essai.<clinit>(Essai.java:17)

Qu en penses tu?

merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
22 mai 2007 à 17:00
Salut,

ouep scuse j'ai mal regardé l'erreur....

effectivement il ne trouve pas la méthode et j'avai pas fait gaffe à ce que tu as fais dans ton code plus haut...

la dll que tu as elle est compilée pour JNI ou c'est une dll classique et tu as voulu utiliser les méthodes dedans sans passer par un wrapper JNI ? pour plus d'infos sur le sujet regarde le how to JNI de sun

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007
22 mai 2007 à 17:08
c une dll classique pour lire des cartes a puce sur un lecteur. je connais les méthodes de cette dll grace à un utilitaire : "dllexp" qui permet de connaitre toutes les méthodes.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
22 mai 2007 à 17:28
Salut,

il faut impérativement que tu fasses un wrapper en JNI pour lier le java et la dll ... sinon c'est mort tu ne pourra jamais toucher à la dll

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007
23 mai 2007 à 12:12
je cherche ce que c un wrapper mais je trouve pas grand chose dessus
Est ce que le wrapper jni est utilisé par javah -jni test ??

J'ai entendu parler de J\Direct. Est ce que cela va marcher dans mon cas?

merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 12:33
Salut,

exploite le tutos de sun (ICI) afin de comprendre ce qu'est JNI

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007
23 mai 2007 à 15:03
je viens de lire la doc et meme temps réaliser la création du .h ... puis je me suis apercu qu'il fallait crée le .c en compilant

Une question me vient, j'utilise une dll, mais je vais pas redéfinir les méthodes de cette dll??
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 15:11
Salut,

nan, en gros depuis ton code c/c++ (celui qui utilise jni pour pouvoir l'exploiter dans ton code java ) tu vas te linker avec la dll proprio (celle que tu voulais au début) et utiliser les fonctions que tu veux,  en fait vois la dll liant jni et l'autre dll comme un wrapper entre le monde du c/c++ et java.

tu vois le truc ?

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
peute51 Messages postés 37 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 21 juin 2007
23 mai 2007 à 15:17
en ce moment g crée mon .h et dans la doc il redefinisse la methode print dans un fichier .c

que faut il que je fasse moi maintenant??

merci de prendre le temps de me répondre
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 17:01
Salut,

voici un petit exemple tout simple qui fait appel à user32.dll dans un code java pour afficher un MessageBox de windows (vois la partie user32 comme la dll qui contient les fonctions que tu souhaites utiliser) :
Note le code c++ est compilé avec visual express

Le code JAVA :

 
public class NativeMessageBox {

 
    static {

        System.loadLibrary("NativeMessageBox");

    }

 
    /** Recuperation de l'environement */

    public native void display(String text);     
 
    public static void main(String [] args) {

        /** affichage de la boite de dialogue */

        new NativeMessageBox().display("Le texte vient de java");

    }

 
}

compilé avec :
javac NativeMessageBox.java
et le header généré avec :
javah -jni NativeMessageBox

voici le fichier HEADER :

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class NativeMessageBox */

 
#ifndef _Included_NativeMessageBox

#define _Included_NativeMessageBox

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     NativeMessageBox

 * Method:    display

 * Signature: (Ljava/lang/String;)V

 */

JNIEXPORT void JNICALL Java_NativeMessageBox_display

  (JNIEnv *, jobject, jstring);

 
#ifdef __cplusplus

}

#endif

#endif

maintenant voici le code en C++ :

#include <windows.h>

#include "NativeMessageBox.h"

 
// Nom de la dll

#define MODULE_NAME "user32.dll"

// Nom de la fonction a utiliser

#define FUNCTION_NAME "MessageBoxA"

// pointeur su la fonction de la dll (soit MessageBoxA) en respectant la signature

typedef int (__stdcall *lpfnMessageBoxA)(int hWnd, char *text, char *title, unsigned int type);

 
//main sauce windows 

bool WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){

    return TRUE;

}

 
//méthode java

JNIEXPORT void JNICALL Java_NativeMessageBox_display(JNIEnv *jenv, jobject jobj, jstring jstr) {

    //on creer une variable pour l'utilisation de la fonction

    lpfnMessageBoxA messageBoxA;

    //ref sur la dll

    HMODULE hmodDLL;

 
    // charge la dll

    hmodDLL = LoadLibrary(MODULE_NAME);

    if (hmodDLL == NULL){//si on ne peut pas charger alors on leve une exception

        jclass Exception = jenv->FindClass("java/lang/Exception");

        jenv->ThrowNew(Exception, MODULE_NAME " not found");

        return;

    }

    //initialise le pointeur sur la fonction de la dll

    messageBoxA = (lpfnMessageBoxA)GetProcAddress(hmodDLL, FUNCTION_NAME);

    if (messageBoxA == NULL) {//si on ne peut pas trouver la fonction alors on leve une exception

        jclass Exception = jenv->FindClass("java/lang/Exception");

        jenv->ThrowNew(Exception, FUNCTION_NAME " function not found");

        //liberation des ressources sur la dll

        FreeLibrary(hmodDLL);

        return;

    }

 
    //cette étape est super importante 

    //en gros tu dois convertir une chaine java avant de l'afficher (en C/C++ 1 char vaut 1octet mais en java 2)

    jboolean isCopy;//pour la liberation

    const char *utf_string;

    //convertion de la chaine java

    utf_string = jenv->GetStringUTFChars(jstr, &isCopy);

    // utilisation de la fonction de la dll et affichage du message de java.

    messageBoxA(0, (char*)utf_string, "Le titre de MessageBoxA", MB_OK);

 
    //liberation des ressources pour la chaine

    if(isCopy == JNI_TRUE)

        jenv->ReleaseStringUTFChars(jstr, utf_string);

 
    //liberation des ressources sur la dll

    FreeLibrary(hmodDLL);

}

voilou tu compile le tout tu met la lib dans le meme rep que la classe java et roule ma poule (j'ai testé ça compile).

maintenant il ne te reste plus qu'a analyser le truc et voir comment tu peux adapter pour faire ce que tu veux avec l'autre dll....

PS:Si tu as des probs de compilation ou autre dsl mais je ne fait pas de support pour microsoft.

PS2: Oublie pas de renseigner les header de java avant de compiler (voir <jdk_home>\include et <jdk_home>\include\windows).

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Rejoignez-nous