Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

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 wink

#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