Java到C++的复杂数据转换

3

晚上好,

这是我在这里的第一篇文章。

我正在进行一个整合项目,但遇到了一些问题。

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

想象一下类似于这样的结构(尽管其格式很丑)

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”和“Size”。

我的问题是当我试图访问“InfoExtra”成员及其属性时。

我可以使用以下代码找到“InfoExtra”:

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

但是,我不知道如何检索它。我该怎么做?

最好的问候 保罗

1个回答

3

首先要做的是更改

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

to

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);

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接