从Java到C++的复杂数据

Complex data from Java to C++

本文关键字:复杂 数据 C++ Java      更新时间:2023-10-16

晚安,

这是我在这里的第一篇帖子。

我正在进行集成,遇到了一些问题。

我正在尝试将一些结构化数据传递到Java<->C++使用JNI,但我遇到了一种情况。

想象一下这样的东西(尽管格式很难看)

Class Detail {
    public int v1;
    public long v2;
}
Class Info {
    public int Number;
    pubinc int Size;
    public Detail InfoExtra[] = new Detail[ 3 ];
    Info(){
        InfoExtra[0] = new Detail();
        InfoExtra[1] = new Detail();
        InfoExtra[2] = new Detail();
        InfoExtra[3] = new Detail();
    }
}

我可以使用GetFieldID()/GetIntField()访问"Number"answers"Size"。

我的问题是当我尝试访问"InfoExtra"成员和您的属性时。

我可以使用找到"InfoExtra"

lfieldID = (env*)->GetFieldID( localClass, "InfoExtra", "[LInfoExtra;" )

但是,我不知道如何取回这个。我该怎么做?

致以最良好的问候Paulo

首先要做的是更改

public Detail InfoExtra[] = new Detail[ 3 ];

public Detail InfoExtra[] = new Detail[ 4 ];

以避免出现讨厌的ArrayIndexOfOutBounds异常。

现在,你的字段签名错了。生成签名的一种快速方法是以下命令:

javap -s p <ClassName>

对于InfoExtra,正确的签名是[LDetail;.

要访问阵列,您可以执行以下操作:

jclass clazz = (*env)->GetObjectClass(env,obj);
jfieldID infoExtra = (*env)->GetFieldID(env, clazz, "InfoExtra", "[LDetail;");
jobjectArray extras = (*env)->GetObjectField(env, clazz,infoExtra);
for (int i=0; i< ((*env)->GetArrayLength(env,extras)); i++) {
    jobject element = (*env)->GetObjectArrayElement(env,extras,i);
    //Do something with it, then release it
    (*env)->DeleteLocalRef(env,element);
}
//Don't forget to release the array as well
(*env)->DeleteLocalRef(env,extras);

希望这能有所帮助!