Petit problème avec la JNI
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:
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:
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:
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:
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:
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 :
Citation:
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 :
Citation:
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