Android SDK 26 и выше - JNI GetObjectField вызывается с ожидающим исключением java.lang.NoSuchFieldError для пользовательского объекта массива - PullRequest
0 голосов
/ 31 октября 2018

В 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;" найдено и поэтому поле "имя поля" не может быть найдено в классе "Lcom..parentClass;" или его суперклассы

Мне известно, что произошли некоторые изменения в более новом SDK . Но я не уверен, как это изменить, чтобы не было ошибок. Спасибо.

1 Ответ

0 голосов
/ 13 ноября 2018

Не уверен насчет комментария @ Алекса, так как я не смог его попробовать.

Я нашел этот обходной путь,


Java Side:

Класс пользовательского объекта, ClassA имеет этот класс Объект массива ClassB , как показано ниже.

public ClassB objb [] = новый ClassB [размер];

Теперь вместо того, чтобы просто отправлять объект ClassA в JNI, я отправил объект ClassA и ClassB по отдельности. Начиная с JNI, он не принимает тип пользовательского объекта из SDK 26.

* 1 028 * 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 и отправлять итератор в качестве параметра sendA () и sendB () для JNI.


Кроме того, существует способ сериализации объекта в строку и десериализации его обратно в объект со стороны JNI. Но, будучи новичком в JNI, я не был достаточно уверен в себе десериализовать объект массива на стороне JNI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...