簡體   English   中英

通過 JNI 將 float[][] 傳遞給 C++ 的最簡單方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM