peute51
Messages postés37Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention21 juin 2007
-
22 mai 2007 à 16:02
Twinuts
Messages postés5374Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention 3 mars 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();
}
}
Twinuts
Messages postés5374Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention 3 mars 2023111 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 ..."
Twinuts
Messages postés5374Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention 3 mars 2023111 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 ..."
peute51
Messages postés37Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention21 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Twinuts
Messages postés5374Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention 3 mars 2023111 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 ..."
peute51
Messages postés37Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention21 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.
Twinuts
Messages postés5374Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention 3 mars 2023111 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 ..."
Twinuts
Messages postés5374Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention 3 mars 2023111 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 */