2011-07-19 43 views
11

在我的Java代碼中,我有一個2D浮點數組float[x][4] floatArray。這裏x可以在1到25之間。我必須通過JNI將這個2D浮點陣列傳遞給C++方法。我JNI方法是通過JNI將float [] []傳遞給C++的最簡單方法

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飄起了困難時期[] []由於缺乏本土開發知識。任何人都可以告訴我最簡單和最安全的方法嗎?由於

+2

你可以簡化這個:

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); } } 

發佈本地陣列參考Java行主要1D數組,並將其傳遞給float [] [4]。在C++中,1D和2D數組在內存中看起來相同。 –

+0

第二個建議將一維數組傳遞給JNI。請記住,您還需要通過尺寸。 – jackrabbit

+0

我決定在JNI和C++中使用vector >。現在我正在讀JNI中的float [] []。填充矢量>並將其傳遞給C++ –

回答

16

像這樣的東西應該工作:

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'主編)

在你的類,你應該聲明native方法:

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

,並在C代碼對應:

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

這是JNI array operations documentation

+0

我認爲問題是如何將在JNI中創建的動態2D浮點數組傳遞給採用float [] []的C++方法。我不認爲這是可能的。是嗎?如果是,那麼語法是什麼? –

+0

是的 - 這是可能的。看看我的例子localArray是指向二維本地數組的指針。你如何聲明取決於你。我的例子展示瞭如何用Java傳遞的數據填充它。 – zacheusz

+0

我更新了float [] [] localArray(我沒有編譯它)的代碼。 – zacheusz

0

釋放所分配的內存,你可以做這樣的事情:通過轉換(在Java中)的2D Java數組的

free(localArray); 
相關問題