从JNI / NDK返回从C到Java的2D原始数组

我已经找到了大量关于如何在JNI中生成2D原始数组并将其返回给Java的文档。 但是这些信息无法描述如何在C中给定上下文传递已经存在的 2D浮点数组(float **)。

为了明确地描述我的问题,我将添加一些我想要实现的C伪代码:

// Returns a 2D float array from C to Java jfloatArray ndk_test_getMy2DArray(JNIEnv* env, jobject thiz, jlong context) { // Cast my context reference MyContextRef contextRef = (MyContextRef) context; // In case we need it below unsigned int length = MyContextGet1DLength(contextRef); // Get the 2D Array we want to "Cast" float** primitive2DArray = MyContextGet2DArray(contextRef); // Hokus pokus... // We do something to create the returnable data to Java // // Below is the missing piece that would convert the primitive // 2D array into something that can be returned consumed and consumed // by Java jfloatArray myReturnable2DArray return myReturnable2DArray; } 

我认为这不是直截了当的,因为我无法找到描述这种情况的任何内容。

感谢任何有用的信息。

感谢Timo的帮助和链接。 对于后人,我正在添加一个完整的代码集,该代码集将通过现有的C 2D原始数组生成可由Java使用的2D原始数组。

 // Returns a 2D float array from C to Java jobjectArray ndk_test_getMy2DArray(JNIEnv* env, jobject thiz, jlong context) { // Cast my context reference MyContextRef contextRef = (MyContextRef) context; // Get the length for the first and second dimensions unsigned int length1D = MyContextGet1DLength(contextRef); unsigned int length2D = MyContextGet2DLength(contextRef); // Get the 2D float array we want to "Cast" float** primitive2DArray = MyContextGet2DArray(contextRef); // Get the float array class jclass floatArrayClass = (*env)->FindClass(env, "[F"); // Check if we properly got the float array class if (floatArrayClass == NULL) { // Ooops return NULL; } // Create the returnable 2D array jobjectArray myReturnable2DArray = (*env)->NewObjectArray(env, (jsize) length1D, floatArrayClass, NULL); // Go through the firs dimension and add the second dimension arrays for (unsigned int i = 0; i < length1D; i++) { jfloatArray floatArray = (*env)->NewFloatArray(env, length2D); (*env)->SetFloatArrayRegion(env, floatArray, (jsize) 0, (jsize) length2D, (jfloat*) primitive2DArray[i]); (*env)->SetObjectArrayElement(env, myReturnable2DArray, (jsize) i, floatArray); (*env)->DeleteLocalRef(env, floatArray); } // Return a Java consumable 2D float array return myReturnable2DArray; } 

不幸的是,我不认为你可以将C浮点数传递给Java,你必须通过将每个成员转换为jFloat将数组转换为jfloats的2D数组。

本质上,您必须创建多维jFloatArray,然后遍历本机C数组,将每个元素转换为其jFloat表示并将其存储到刚刚创建的jFloatArray中的相同位置。

这部分文档应该更深入地解释它。

我已经为转换做了一个简单的function:

 jobjectArray getJNIArray(JNIEnv *env, jobject obj, const vector >& arr) { jclass floatClass = env->FindClass("[F"); // jsize height = arr.size(); // Create the returnable 2D array jobjectArray jObjarray = env->NewObjectArray(height, floatClass, NULL); // Go through the first dimension and add the second dimension arrays for (unsigned int i = 0; i < height; i++) { jfloatArray floatArray = env->NewFloatArray(arr[i].size()); env->SetFloatArrayRegion(floatArray, (jsize) 0, (jsize) arr[i].size(), (jfloat*) arr[i].data()); env->SetObjectArrayElement(jObjarray, (jsize) i, floatArray); env->DeleteLocalRef(floatArray); } return jObjarray; 

}