晚安,
这是我在此的头一篇博文。
我正在进行集成,但遇到了一些问题。
我正在尝试使用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);
希望这可以帮助!