C ++ et JNI – Comment passer un tableau dans un jfloatArray

Je me suis amusé avec mon propre petit projet pour apprendre moi-même le ndk android en utilisant c ++ et jni, mais je ne sais pas comment passer les données d’un tableau float java au tableau c ++. J’ai utilisé le jni mis en place. La plupart des tutoriels que je trouve sont soit trop simples et trop explicites, soit trop compliqués et passent en revue ma compréhension pour le moment. Ainsi, quelqu’un peut-il simplement me montrer un exemple simple de tableau passé de java à c ++, puis faire exécuter une méthode / fonction sur les données et le renvoyer à java.

Voici ma tentative jusqu’ici, mais il me rest deux erreurs. Je ne suis pas sûr que le rest de la syntaxe soit à la hauteur, mais je ne vois rien au moment de la compilation.

#include  #include  #include  #include  using namespace Eigen; Vector3f vec; Vector3f vec2; Vector3f vecRtrn; void vecLoad(float x, float y, float z, float x2, float y2, float z2){ vec(0) = x; vec(1) = y; vec(2) = z; vec2(0) = x2; vec2(1) = y2; vec2(2) = z2; } void vecAdd(Vector3f vecA, Vector3f vecB){ vecRtrn = vecA+vecB; } extern "C" { JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test (JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2){ float array1[3]; jfloatArray flt1 = fltarray1; jfloatArray flt2 = fltarray2; //flt1 = env->GetFloatArrayElements( fltarray1,0); //flt2 = env->GetFloatArrayElements( fltarray2,0); vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]); vecAdd(vec, vec2); array1[0] = vecRtrn[0]; array1[1] = vecRtrn[1]; array1[2] = vecRtrn[2]; return array1; }; } 

Et ce sont les erreurs au moment de la compilation

  $ /cygdrive/c/android-ndk-r7/ndk-build Comstack++ thumb : test <= test.cpp jni/test.cpp: In function '_jfloatArray* Java_jnimath_act_JnimathActivity_test(JNIEnv*, _jobject*, _jfloatArray*, _jfloatArray*)': jni/test.cpp:42: error: cannot convert '_jfloatArray' to 'float' for argument '1' to 'void vecLoad(float, float, float, float, float, float)' jni/test.cpp:49: error: cannot convert 'float*' to '_jfloatArray*' in return make: *** [obj/local/armeabi/objs/test/test.o] Error 1 

Tout d’abord, vous ne pouvez pas utiliser jfloatArray directement. Au lieu de cela, vous devriez le faire

 JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test (JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2) { jfloatArray result; result = env->NewFloatArray(3); if (result == NULL) { return NULL; /* out of memory error thrown */ } jfloat array1[3]; jfloat* flt1 = env->GetFloatArrayElements( fltarray1,0); jfloat* flt2 = env->GetFloatArrayElements( fltarray2,0); vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]); vecAdd(vec, vec2); array1[0] = vecRtrn[0]; array1[1] = vecRtrn[1]; array1[2] = vecRtrn[2]; env->ReleaseFloatArrayElements(fltarray1, flt1, 0); env->ReleaseFloatArrayElements(fltarray2, flt2, 0); env->SetFloatArrayRegion(result, 0, 3, array1); return result; } 

Veuillez utiliser ceci comme tutoriel et étudier davantage. Comme je l’ai déjà dit, étudier vous aidera plus que de pratiquer en ce moment.

Au lieu du style plus ancien (au-dessus du code de Tae-Sung Shin, fonctionne toujours), nous devrions le faire de nos jours:

 jfloatArray result; result = (*env)->NewFloatArray( env, numbers_here ); 

Ceci est fondamentalement suffisant pour créer un tableau vide avec de nouveaux ndks. En supposant que env est votre environnement JNI.

 jfloatArray jArray = env -> NewFloatArray(8);