Bonjour, j'ai un problème quant à la récupération des données d'un objet java passé en paramètre à une methode c++. J'ai réalisé ce petit exemple pour que ce soit plus clair :
Voici mes classes 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
17
18
19
20
21
22
23
24
25
26
package test;
 
public class TestJNI {
 
 
	// Librairy c++
	static {System.loadLibrary("maLibrary");}	// Déclaration de la library dynamique
	public native void goCpp(double unDouble, MonObjet obj);
 
	// Attribut
	private double doubleTemoin;
	private MonObjet monObjet;
 
	public TestJNI(double doubleTemoin, MonObjet monObjet) {
		super();
		this.doubleTemoin = doubleTemoin;
		this.monObjet = monObjet;
	}
 
	public void appelAuCpp () {
		System.out.println("Appel au c++");
		goCpp (doubleTemoin, monObjet);		
		System.out.println("Fin appel");
	}
 
}//end of class
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
17
18
19
20
package test;
 
public class MonObjet {
 
	double monAutreDouble;
 
	public MonObjet(double monAutreDouble) {
		super();
		this.monAutreDouble = monAutreDouble;
	}
 
	public double getMonAutreDouble() {
		return monAutreDouble;
	}
 
	public void setMonAutreDouble(double monAutreDouble) {
		this.monAutreDouble = monAutreDouble;
	}	
 
}//end of class
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
package test;
 
public class MonTest {
 
	public static void main(String[] args) {
 
		TestJNI t = new TestJNI (2.1, new MonObjet (2.2));
		t.appelAuCpp ();
 
	}
 
}//end of class
Et voici mon fichier .cpp
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "test_TestJNI.h" 
#include <iostream>
#include <jni.h>
 
using namespace std;
 
JNIEXPORT void JNICALL Java_test_TestJNI_goCpp (JNIEnv *env, jobject t, jdouble d, jobject mo) {
 
	jclass monObjet, testJNI;
	jfieldID fid;
 
	jdouble monAutreDouble, doubleTemoin;
 
	monObjet = env -> GetObjectClass(mo);
	testJNI = env -> GetObjectClass(t);	  
 
	cout << "---- <C++> ----" << endl;
 
	 cout << "Le double passé en paramètre = " << d << endl;
 
	fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
	doubleTemoin = env -> GetDoubleField(testJNI, fid);
 
	fid = env -> GetFieldID(monObjet,"monAutreDouble", "D");
	monAutreDouble = env -> GetDoubleField(monObjet, fid);
 
	cout << "Ce même double récupéré directement dans la classe = " << doubleTemoin << endl;	
 
	cout << "L'autre d'ouble récupéré dans l'objet MonObjet = " << monAutreDouble << endl;
 
	cout << "---- </C++> ----" << endl;  	
 
}//end of method
ainsi que sont .h
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
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test_TestJNI */
 
#ifndef _Included_test_TestJNI
#define _Included_test_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_TestJNI
 * Method:    goCpp
 * Signature: (DLtest/MonObjet;)V
 */
JNIEXPORT void JNICALL Java_test_TestJNI_goCpp
  (JNIEnv *, jobject, jdouble, jobject);
 
#ifdef __cplusplus
}
#endif
#endif
Et voici le résultat que j'obtiens :
Appel au c++
---- <C++> ----
Le double passé en paramètre = 2.1
Ce même double récupéré directement dans la classe = 0
L'autre d'ouble récupéré dans l'objet MonObjet = 1.16741e-314
---- </C++> ----
Fin appel
Quand je passe le double en paramêtre, tout fonctionne correctement. En revanche dès que j'essaie d'aller le chercher dans un objet java, j'obtiens une valeur abérrante.
Qqun saurait-il où se situe mon erreur ?

Merci d'avance

PS : je suis sous linux (ubuntu edgy), et voici la ligne que j'utilise pour compiler la library :
g++ -o libmaLibrary.so -fPIC -shared -I /usr/lib/jvm/java-6-sun-1.6.0.00/include/ -I /usr/lib/jvm/java-6-sun-1.6.0.00/include/linux/ maLibrary.cpp