Bonjour à tous !
Me voici confronté à un problème sur lequel je perds mon latin ... je vous explique:
Je souhaite utiliser une DLL en Java via JNI.
J'ai donc crée un code de ce type:
Je compile (sous windows):
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 class XYZ_Interface { public native String XYZ_DecodeMessage(String filePath, int nMessageTag, String pucBinary, int nBinarySize); static { System.load("C:\\skjhdsjhdjqksd\\xyz_int.dll"); } public static void main(String[] args) { String hexStr = "392E373239363032303133333330303030353032202020202020313030373031313032393030464F30303031303030301C4634323934343320201C4730393238434443361C361E453035311E493735321E513031303035374231323044453441454435303336333033301E4820301C391E41351E6F31323603"; System.out.println("J - Chaine encodee:\n" + hexStr); System.out.println("J - Chaine recue:\n" + new XYZ_Interface().XYZ_DecodeMessage("sample.xml", 3842, hexStr, hexStr.length())); } }
Je génère le .h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part javac XYZ_Interface.java
Je code ma DLL que je compile comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part javah -jni XYZ_Interface
J'exécute le tout avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gcc -c xyz_int.c abcdef.h XYZ_Interface.h XYZ_.h gcc -shared -o xyz_int.dll xyz_int.c XYZ_Interface.def -Wl,--enable-stdcall-fixup
et j'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part java XYZ_Interface
Bref, l'appel à ma DLL fonctionne et j'ai bien la chaine décodée que je souhaite obtenir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 J - Chaine encodee: 392E3732393630323031333333303030303530322020202020203130303730313 [...] J - Chaine reçue: 0001000081000000000000000082810000D0EA03000000392E00810100D0EA04 [...]
C'est là qu' Eclipse intervient... je copie-colle la classe Java présentée ci-dessus et je l'ajoute dans mon projet.Mais où est ton problème, mec ?
Je met un try/catch autour du System.load() pour récupérer les UnsatisfiedLinkError.
Le System.load() semble bien se passer puisqu' aucune exception n'est levée, mais le code reste bloqué sur l'appel à ma fonction XYZ_Decodemessage(), si bien que dans la console je n'obtiens que:
Après avoir mis plusieurs breakpoint un peu partout, il semble que la DLL soit bien chargée, mais que le mapping de la fonction ne fonctionne pas, d'où le fait qu'il n'y ai jamais de retour.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 J - Chaine encodee: 392E3732393630323031333333303030303530322020202020203130303730313[...]
Comment expliquer que sans Eclipse cela fonctionne et qu'avec Eclipse le même code ne fonctionne plus ?
Merci d'avance pour votre aide, et n'hésitez pas à me demander des précisions si besoin.
Pour info: Eclipse v3.5.0, JDK pour la compil manuelle 1.6.0_24.
PS: j'ai essayé de compiler une DLL qui exporte une fonction DecodeMessage() vide, mais j'ai me même problème. Il ne s'agit donc pas, à mon sens, d'un problème de la DLL.
Partager