Как установить IntField из нативного jni на Java Android 10 - PullRequest
0 голосов
/ 14 января 2020

После обновления моего проекта для поддержки Android 10, cra sh, созданный на уровне JNI, связан с ограничениями интерфейса не-SDK в Android 10:

 JNI DETECTED ERROR IN APPLICATION: JNI SetIntField called with pending exception java.lang.NoSuchFieldError: no "I" field "value" in class "Ljava/lang/Integer;" or its superclasses

, которые происходят из этого часть кода:

jclass clazz = (*env)->GetObjectClass(env, outputObj);
jfieldID mi = (*env)->GetFieldID(env, clazz, "value", "I");
(*env)->SetIntField(env, outputObj, mi, pListLen);

Чтобы исправить это, я заменяю его на:

jclass clazz = (*env)->GetObjectClass(env, outputObj);
jmethodID intValueMethod = (*env)->GetMethodID(env, clazz, "intValue", "()I");
jint result = (*env)->CallIntMethod(env, outputObj,intValueMethod,pListLen);

После этого мое приложение не обрабатывает sh и правильно находит целое значение, но я хотите установить целое число результата в коде Java, используя тот же метод SetIntField.

Не могли бы вы дать мне способ или метод для установки результата в части Java.

1 Ответ

0 голосов
/ 15 января 2020

Поскольку изменение поля intger не является хорошей практикой для части JNI, поэтому я изменил способ, вместо этого изменив его методом отражения

    jclass clazz = (*env)->GetObjectClass(env, outputBufLen);
    jmethodID value_of = (*env)->GetStaticMethodID(env,clazz, "valueOf", "(I)Ljava/lang/Integer;");
    jobject result = (*env)->CallStaticObjectMethod(env,clazz, value_of, pOutBufLen);

Я установил результат в массиве int и возвращаю его:

int result = (*env)->CallStaticObjectMethod(env,clazz, value_of, pOutBufLen);

jintArray resultArray = (*env)->NewIntArray(env, 2);
jint fill[2];
fill[0] = result;
fill[1] = (jint) pOutBufLen;
(*env)->SetIntArrayRegion(env, result, 0, 2, fill);

return (resultArray);
...