Bonjour,

j'ai voulu faire un test pour passer un objet à un code natif, récupérer la valeur d'un des champs et retourner un autre objet.

Voici la petite classe en question :
Code java : 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
 
public class Miniball
{
public native Disk Compute2D(Coordinates c) ;
 
public void Test(Coordinates c)
	{
	Disk disk = Compute2D(c) ;
	if ( disk == null ) System.out.println("oups null") ;
	}
 
public static void main(String[] args)
{
Miniball mini = new Miniball() ;
mini.Test(new Coordinates(11, 23)) ;
}
 
}

qui utilise les deux petites classes suivantes :
Code java : 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
 
public class Coordinates
{
public int X, Y ;
 
public Coordinates(int X, int Y)
	{
	this.X = X ;
	this.Y = Y ;
	}
}
 
public class Disk
{
public double X, Y, Radius ;
 
public Disk(double x, double y, double Radius)
	{
	this.X = x ;
	this.Y = y ;
	this.Radius = Radius ;
	}
}
Là il n'y a absolument aucun souci...

Voici mon code C++ :
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
JNIEXPORT jobject JNICALL Java_measures_miniball_Miniball_Compute2D__Lmathematics_primitives_pointsTiTi_Coordinates_2(JNIEnv *env, jobject obj, jobject Coordinates)
	{
	jclass DiskClass = env->FindClass("mathematics/primitives/Disk") ; // On trouve la classe à retourner
	if ( !DiskClass ) return NULL ;
	jmethodID DiskConstructor = env->GetMethodID(DiskClass, "<init>", "(DDD)V") ; // On trouve le constructeur
	if (!DiskConstructor) return NULL ;
 
	jclass CoordinatesClass = env->GetObjectClass(Coordinates) ; // Je récupère l'objet java.
	jfieldID X = env->GetFieldID(CoordinatesClass, "X", "I") ; // Je trouve le champ qui m'intéresse
	int x = env->GetIntField(CoordinatesClass, X) ; // J'accède à la valeur du champ.
	printf("x = %d", x) ;
 
	return env->NewObject(DiskClass, DiskConstructor, (double)x, 2.01, 3.57) ;
	}

Tout se passe bien pour trouver la classe Disk et l'instancier.
J'ai un problème pour accéder au champ X de la classe Coordinates. Le code compile parfaitement, mais il me retourne toujours la valeur x=0.
Est ce que quelqu'un pourrait m'aider ?
Merci par avance ?


PS : j'ai regardé en ligne et trouvé plein de codes qui font cela, mais en utilisant un code du type :
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
jclass CoordinatesClass = (*env)->GetObjectClass(env, Coordinates) ; // Je récupère l'objet java.
jfieldID X = env->GetFieldID(env, CoordinatesClass, "X", "I") ; // Je trouve le champ qui m'intéresse
int x = (*env)->GetIntField(env, CoordinatesClass, X) ; // J'accède à la valeur du champ.
Mais ça ne veut absolument pas compiler chez moi.