2011-07-19 40 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); 
相关问题