如何将 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);
更新我的项目以支持 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);