有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

AndroidSDK26之后的JNI GetObjectField被调用,带有挂起的异常java。自定义数组对象的lang.NoSuchFieldError

JNI中,我正在调用一个自定义数组对象。我从foo那里得到了它的类型。getclass()。getName()并使用它来获取GetFieldID。 类型如下:[L完全限定类名

sdk25中,我能够毫无错误地获取“GetObjectField

在SDK 26中,我得到以下错误:

A/zygote64: java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: JNI GetObjectField called with pending exception java.lang.NoSuchFieldError: no type "[Lcom..customClassName;" found and so no field "fieldname" could be found in class "Lcom..parentClass;" or its superclasses

我知道较新的SDK中有一些变化。但是,我不知道如何改变它,以便没有错误。 谢谢


共 (1) 个答案

  1. # 1 楼答案

    不确定@Alex的评论,因为我无法尝试

    不过我找到了解决办法


    Java端:

    自定义对象的类ClassA具有该类ClassB的数组对象,如下所示

    public ClassB objb[] = new ClassB[size];

    现在,我不再只向JNI发送ClassA的对象,而是分别发送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端反序列化定制数组对象