如何将 IntField 从本机 jni 设置为 Java Android 10

How to set IntField from native jni to Java Android 10

更新我的项目以支持 Android 10 后,在 JNI 级别产生的崩溃与 Android 10 中的非 SDK 接口限制有关:

 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);

在那之后我的应用程序没有崩溃并正确找到整数值,但我想使用相同的方法 SetIntField 在 Java 代码上设置结果整数。

能否请您给我一种在 Java 部分设置结果的方式或方法。

由于更改整数字段在 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 数组下并且我 return 它 :

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);