3D JNI C ++中的浮点数组

时间:2014-07-03 03:52:55

标签: java c++ arrays multidimensional-array java-native-interface

我在使用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;
}

感谢任何帮助。 托马斯

1 个答案:

答案 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维指针即可。