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:
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 :
Là il n'y a absolument aucun souci...Code:
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 ; } }
Voici mon code C++ :
Code:
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 :
Mais ça ne veut absolument pas compiler chez moi.Code:
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.