使用JNI从C++返回一个具有2D数组的Java对象



我有一个Java对象:

int  numberOfROI;
int ptrToNumberOfPointsInEachROI[];
double ptrToROIListContaingROI[][];
}

我正在尝试使用JNI从C++返回JAVA OBJECT。我可以设置INT和1D数组成员变量但是我没有成功设置2D阵列

正如我所提到的:我可以设置numberOfROI(int(和ptrToNumberOfPointsInAchROI 1D数组。但是未能设置ptrToROIListContaingROI,这是一个2D阵列。

JNIEXPORT jobject JNICALL sayHello(JNIEnv *env, jobject thisObj) {
jclass myClass = env->FindClass("ROI_LIST_INFO");
jobject jobj = env->AllocObject(myClass);
jfieldID fid = env->GetFieldID(myClass, "numberOfROI", "I");
env->SetIntField(jobj, fid, 10);  // Set Int
jfieldID fid1 = env->GetFieldID(myClass, "ptrToNumberOfPointsInEachROI", "[I");  //Set 1D Array
jint attribs[] = {
66,77
};
//int len = SDL_arraysize(attribs);
jintArray intArry = env->NewIntArray(2);
env->SetIntArrayRegion(intArry, 0, 2, attribs);
env->SetObjectField(jobj,fid1,intArry);

jdouble attribDouble[][2] = { {66.6,77.7},{88.8,99.9}};
jfieldID fid2 = env->GetFieldID(myClass, "ptrToROIListContaingROI", "[[D");
jdoubleArray jrow;
jdouble row[2];
jobjectArray rows;
for(int j=0;j<2;j++){
//Traverse columns
for(int k=0;k<2;k++){
//Set current element of the matrix accordingly
row[k] = attribDouble[j][k];
}
//Temporarily allocate a new row in JVM heap space
//No need to unpin an array allocated with New...Array in the end
jrow = env->NewDoubleArray(2);
//Fill the newly allocated row
env->SetDoubleArrayRegion(jrow,0,2,row);
//Write the newly filled row to the appropriate row of our matrix
//env->SetObjectArrayElement((jobjectArray)jrow, j, (jobject)row);
env->SetObjectArrayElement(rows,j,jrow);
printf("INNER rows[j] %d:n",rows[j]);
}
//env->SetObjectField(jobj,fid2,rows);
return jobj;
}

您未初始化rows。要创建新的double[][],您需要执行以下操作:

jclass double_array_class = env->FindClass("[D");
jobjectArray rows = env->NewObjectArray(2, double_array_class, NULL);     

此外,您不应该像在printf中那样尝试为rows加下标。它保存(或指向(对Java数组的引用,但它本身不是数组。

最新更新