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 classEt 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 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
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
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
Et voici le résultat que j'obtiens :
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
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.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
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
Partager