通过JNI将float 传递给C ++的最简单方法

在我的Java代码中,我有一个2D浮点数组float[x][4] floatArray 。 这里x可以在1到25之间。我必须通过JNI将这个2D float数组传递给C++方法。 我的JNI方法是

 jboolean MyJNIMethod(JNIEnv * env, jobject obj, jobjectArray myArray) { //how to convert this myArray to something that can be safely passed to C++ method below } 

MyJNIMethod我必须调用C++方法并将从Java获取的2D float数组传递给此方法

 bool MyCplusPlusMethod(float coordinates[][4]) { } 

由于缺乏原生开发知识,我很难将jobject正确地转换为float [] []。 有人能告诉我最简单,最安全的方法吗? 谢谢

像这样的东西应该工作:

 jboolean MyJNIMethod(JNIEnv * env, jobject obj, jobjectArray myArray) { int len1 = env -> GetArrayLength(myArray); jfloatArray dim= (jfloatArray)env->GetObjectArrayElement(myArray, 0); int len2 = env -> GetArrayLength(dim); float **localArray; // allocate localArray using len1 localArray = new float*[len1]; for(int i=0; iGetObjectArrayElement(myArray, i); jfloat *element=env->GetFloatArrayElements(oneDim, 0); //allocate localArray[i] using len2 localArray[i] = new float[len2]; for(int j=0; j 

请注意,这是大纲。 它不会编译;)(我在这个过度加密的编辑器中写了它)

在你的课堂上,你应该声明原生方法:

  public native void myJNIMethod(float[][] m); 

并在您的C代码中对应:

 JNIEXPORT jboolean JNICALL Java_ClassName_methodName (JNIEnv *, jobject, jobjectArray); 

这是JNIarrays操作文档 。

要释放已分配的内存,您可以执行以下操作:

 static void releaseMatrixArray(JNIEnv *env, jobjectArray matrix) { int size = (*env)->GetArrayLength(env, matrix); for (int i = 0; i < size; i++) { jfloatArray oneDim = (jfloatArray) (*env)->GetObjectArrayElement(env, matrix, i); jfloat *elements = (*env)->GetFloatArrayElements(env, oneDim, 0); (*env)->ReleaseFloatArrayElements(env, oneDim, elements, 0); (*env)->DeleteLocalRef(env, oneDim); } } 

发布本地数组引用:

 free(localArray);