Pages : 1
#1 Le 12/06/2007, à 14:07
- fjeannet
[RESOLU]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 :
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
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
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
#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 double récupéré dans l'objet MonObjet = " << monAutreDouble << endl;
cout << "---- </C++> ----" << endl;
}//end of method
ainsi que sont .h
/* 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 double 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
Dernière modification par fjeannet (Le 13/06/2007, à 10:53)
Hors ligne
#2 Le 13/06/2007, à 10:52
- fjeannet
Re : [RESOLU]Petit problème avec la JNI
C'est bon, j'ai trouvé d'où ça venait
#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;
jmethodID mid;
jdouble monAutreDouble, doubleTemoin;
cout << "---- <C++> ----" << endl;
cout << "Le double passé en paramètre = " << d << endl;
fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
doubleTemoin = env -> GetDoubleField(t, fid);
fid = env->GetFieldID(monObjet,"monAutreDouble", "D");
monAutreDouble =env-> GetDoubleField(mo, 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
en fait, pas besoin des lignes :
monObjet = env-> GetObjectClass(mo);
testJNI = env -> GetObjectClass(t);
il suffit simplement d'utiliser les jobject passés en paramètres.
Hors ligne