晚安,

这是我在此的头一篇博文。

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

我正在尝试使用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()访问“数字”和“大小”。

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

我可以使用以下方法找到“InfoExtra”:
lfieldID = (env*)->GetFieldID( localClass, "InfoExtra", "[LInfoExtra;" )

但是,我不知道该如何检索。我怎样才能做到这一点?

最好的祝福
保罗

最佳答案

首先要做的就是改变

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

希望这可以帮助!

07-24 09:26