Android SDK 26及更高版本-自定义数组对象的JNI GetObjectField调用带有待处理异常java.lang.NoSuchFieldError

时间:2018-10-31 12:45:42

标签: java android java-native-interface

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中有一些更改。但是,我不确定如何更改它以便没有错误。 谢谢。

1 个答案:

答案 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方面反序列化自定义数组对象。