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:

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 compile (sous windows):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
javac XYZ_Interface.java
Je génère le .h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
javah -jni XYZ_Interface
Je code ma DLL que je compile comme suit:
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
J'exécute le tout avec:
et j'obtiens:
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
 
[...]
Bref, l'appel à ma DLL fonctionne et j'ai bien la chaine décodée que je souhaite obtenir.

Mais où est ton problème, mec ?
C'est là qu' Eclipse intervient... je copie-colle la classe Java présentée ci-dessus et je l'ajoute dans mon projet.

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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
J - Chaine encodee:
392E3732393630323031333333303030303530322020202020203130303730313[...]
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.

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.