在 JNI 中,我正在调用自定义数组对象。我从foo.getclass()。getName()获得了它的类型,并使用它来获取 GetFieldID 。 类型如下:[L完全限定的类名称。
在 SDK 25 中,我可以无任何错误地获取“ GetObjectField ”。
在 SDK 26 中,出现以下错误:
A / zygote64:java_vm_ext.cc:534] JNI检测到应用程序错误: 带有未决异常的JNI GetObjectField调用 java.lang.NoSuchFieldError:没有类型“ [Lcom..customClassName;” 找到,因此在类中找不到字段“ fieldname” “ Lcom..parentClass;”或其超类
我知道新版SDK中有一些更改。但是,我不确定如何更改它以便没有错误。 谢谢。
答案 0 :(得分:0)
不确定@Alex的评论,因为我无法尝试。
我发现了这种解决方法,
Java Side:
自定义对象的类 ClassA 具有此类 ClassB 的数组对象,如下所示。
公共ClassB objb [] =新的ClassB [size];
现在,我不再只是将 ClassA 的对象发送给JNI,而是分别发送了ClassA和 ClassB 的对象。 从JNI开始,它不接受SDK 26中的自定义对象类型。
sendA(obja);
sendB(obja.objb [0]);
JNI端:
ClassA a;
//sendA function for classA similiar as below.
extern "C"
JNIEXPORT jint JNICALL
Java_<PATH_TO_FUNCTION>_sendB(JNIEnv *env,jobject instance,jobject BObj) {
LOGD(TAG,"sendB: START");
jclass jBClass=env->FindClass("com/< path to class separated by '/' >");
// int Field jbid
jfieldID jbid = env->GetFieldID(jBClass, "bId", "I");
jint bId = env->GetIntField(BObj, jbid);
obja.objb[0].bId = (int) bId;
LOGI(TAG, "\t bId[%d]: %d ", 0, obja.objb[0].bId);
return 0;
}
对于迭代,您可以在Java端使用 for循环,并将迭代器作为sendA()和sendB()的参数发送给JNI。
此外,还有一种方法可以将对象序列化成字符串,然后反序列化从JNI端返回对象。但是,作为JNI的新手,我不是有信心在JNI方面反序列化自定义数组对象。