我在使用C ++的JNI向Java发送3D数组时遇到了麻烦。
数组应该像这个浮点数据[6] [26] [5]
到目前为止,我还没看过。
JNIEXPORT jobjectArray JNICALL Java_JNITest_getArray
(JNIEnv * env, jobject obj)
{
PClass* pClass;
jclass cls1;
jclass jcls1;
jclass jcls2;
jobject obj2;
cls1 = env->GetObjectClass(obj);
fid1 = env->GetFieldID(cls1, "ptr", "J");
pClass = (PClass*) env->GetLongField(obj, fid1);
jcls1 = env->FindClass("[[F");
jcls2 = env->FindClass("[F");
jobjectArray array1 = env->NewObjectArray(6, jcls1 , NULL);
for(int i = 0; i < 6; i++) {
jobjectArray array2 = env->NewObjectArray(26, jcls2, NULL);
for (int j = 0; j < 26; j++) {
jfloatArray array3 = env->NewFloatArray(5);
env->SetFloatArrayRegion(array3, 0, 5, pClass->data[i][j]);
env->SetObjectArrayElement(array2, j, array3);
}
env->SetObjectArrayElement(array1, i, array2);
}
env->DeleteLocalRef(cls);
return array1;
}
感谢任何帮助。 托马斯
答案 0 :(得分:0)
除了删除在组装数组时创建的本地引用并测试cls1 = env->GetObjectClass(obj);
和fid1 = env->GetFieldID(cls1, "ptr", "J");
的返回值之外,您的代码看起来正确。
唯一可能有问题的行是:pClass = (PClass*) env->GetLongField(obj, fid1);
。通常,您将在C ++中使用以下内容创建并填充数组:
data = new float**[6];
for (int i = 0; i < 6; i++) {
data[i] = new float*[26];
for (int j = 0; j < 26; j++) {
data[i][j] = new float[5];
}
}
然后,像在代码段中一样,将这部分内存分配给java数组。另外,您可以预先分配所有内存,而只需重新指向3维指针即可。