[英]Simplest way to pass float[][] to C++ via JNI
在我的 Java 代碼中,我有一個二維浮點數組float[x][4] floatArray
。 這里x
可以在 1 到 25 之間。我必須通過JNI
將此二維浮點數組傳遞給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 的二維浮點數組傳遞給此方法
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; i<len1; ++i){
jfloatArray oneDim= (jfloatArray)env->GetObjectArrayElement(myArray, i);
jfloat *element=env->GetFloatArrayElements(oneDim, 0);
//allocate localArray[i] using len2
localArray[i] = new float[len2];
for(int j=0; j<len2; ++j) {
localArray[i][j]= element[j];
}
}
//TODO play with localArray, don't forget to release memory ;)
}
請注意,這是大綱。 它不會編譯;)(我在這個 overstacks 的編輯器中寫的)
在您的 class 中,您應該聲明本機方法:
public native void myJNIMethod(float[][] m);
並在您的 c 代碼中對應:
JNIEXPORT jboolean JNICALL Java_ClassName_methodName (JNIEnv *, jobject, jobjectArray);
這是JNI 數組操作文檔。
要釋放分配的 memory,您可以執行以下操作:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.