Façon la plus simple de passer float[][] pour C++ via JNI
Dans mon code Java j'ai un 2D float array float[x][4] floatArray
. Ici x
peut être comprise entre 1 et 25. J'ai passer cette 2D float tableau à une C++
méthode via JNI
. Mon JNI
méthode est
jboolean MyJNIMethod(JNIEnv * env, jobject obj, jobjectArray myArray)
{
//how to convert this myArray to something that can be safely passed to C++ method below
}
À l'intérieur de MyJNIMethod
je dois appeler un C++
méthode et passer 2D float array prises de Java à cette méthode
bool MyCplusPlusMethod(float coordinates[][4])
{
}
Je vais avoir du mal à bien la conversion de jobject pour float[][] en raison du manque de développement natif de connaissances. Quelqu'un peut me dire la plus simple et la plus sûre façon possible? Grâce
Vous pouvez simplifier cette opération par conversion (en Java) de la 2D Java tableau à une Java ligne-major 1D tableau, et en passant que dans le float[][4]. En C++, les 1D et 2D tableaux de regarder la même chose dans la mémoire.
La deuxième suggestion pour passer un tableau à une dimension au cours de la JNI. N'oubliez pas que vous aurez également besoin de passer la taille puis.
J'ai décidé d'utiliser vector <vector <float > > à l'intérieur JNI et C++. Maintenant, je suis de lecture float[][] dans la JNI. Le remplissage de vector <vector <float> >, et en le passant à C++
Grande - bon choix. Vous pouvez toujours utiliser mon exemple 😉
La deuxième suggestion pour passer un tableau à une dimension au cours de la JNI. N'oubliez pas que vous aurez également besoin de passer la taille puis.
J'ai décidé d'utiliser vector <vector <float > > à l'intérieur JNI et C++. Maintenant, je suis de lecture float[][] dans la JNI. Le remplissage de vector <vector <float> >, et en le passant à C++
Grande - bon choix. Vous pouvez toujours utiliser mon exemple 😉
OriginalL'auteur Haris Hasan | 2011-07-19
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cela devrait fonctionner:
Noter que c'est le contour. Il ne compile pas 😉 (je l'ai écrit dans ce overstacks' éditeur)
Dans votre classe, vous devez déclarer la méthode native:
et dans votre code c correspondant:
Ici est JNI tableau des opérations de la documentation.
Oui, c'est possible. Regarde mon exemple localArray est le pointeur à deux dimensions, natif de tableau. Comment vous déclarez qu'il est jusqu'à vous. Mon exemple est de montrer comment le remplir avec les données transmises à partir de Java.
J'ai mis à jour le code avec alocation de float[][] localArray (je n'ai pas le compiler).
J'ai utilisé ce code mais je ne savais pas à propos de
env->ReleaseIntArrayElements(oneDim, element, JNI_ABORT)
etenv->DeleteLocalRef(oneDim);
Donc j'ai eu une fuite de mémoire jusqu'à ce que j'ai compris, juste un heads-upOriginalL'auteur
Pour libérer la mémoire allouée vous pouvez faire quelque chose comme ceci:
la libération locale de la Matrice de référence:
OriginalL'auteur