将 jobjectArray 从 JNI 传递到 Java 在 Android API 21/22 上崩溃,但在 API 19 上工作
Pass jobjectArray from JNI to Java crash on Android API 21/22 but work on API 19
我使用以下代码来处理 Android 和 JNI 中的 JNI 数组。
但是我发现 return "jobjectArray" 无法在 API 21/22 (Android 5.0) 上完成,但可以在 API 19 上完成。(Android 4.4)
(无法完成 意味着它在 JNI 部分 return 但它挂起并且在 Java 上没有响应)
这是我尝试在我的 Android 应用程序中实现的伪代码。
jobjectArray Java_com_test_Simplejni(JNIEnv* env, jobject thisObj)
jclass localClass = env->FindClass("java/lang/Object");
jclass objClass = reinterpret_cast<jclass>(env->NewGlobalRef(localClass));
args = env->NewObjectArray(len, objClass, 0);
return args;
}
java部分函数如下:
String[] Simplejni();
报错信息如下:
JNI DETECTED ERROR IN APPLICATION: attempt to return an instance of java.lang.Object[] from com.test.Simplejni
请告知如何调查此问题的任何建议,谢谢。
更新:20150427
- 我尝试简化 return 空的 jobjectArray,它在 Android 4.4 中工作但在 Android 5.0 中失败(使用相同的代码)
- 我的IDE是Android工作室
我找到了解决这个问题的方法:
例如,您只需在 API 21+ 上将 java/lang/Object
替换为您的 java 对象 class,
jclass localClass = env->FindClass("com/example/YourLocalClass");
,
从日志中,我们可以知道对象 class 不是 yourJavaLocalObject class.
的实例
我使用以下代码来处理 Android 和 JNI 中的 JNI 数组。
但是我发现 return "jobjectArray" 无法在 API 21/22 (Android 5.0) 上完成,但可以在 API 19 上完成。(Android 4.4) (无法完成 意味着它在 JNI 部分 return 但它挂起并且在 Java 上没有响应)
这是我尝试在我的 Android 应用程序中实现的伪代码。
jobjectArray Java_com_test_Simplejni(JNIEnv* env, jobject thisObj)
jclass localClass = env->FindClass("java/lang/Object");
jclass objClass = reinterpret_cast<jclass>(env->NewGlobalRef(localClass));
args = env->NewObjectArray(len, objClass, 0);
return args;
}
java部分函数如下:
String[] Simplejni();
报错信息如下:
JNI DETECTED ERROR IN APPLICATION: attempt to return an instance of java.lang.Object[] from com.test.Simplejni
请告知如何调查此问题的任何建议,谢谢。
更新:20150427
- 我尝试简化 return 空的 jobjectArray,它在 Android 4.4 中工作但在 Android 5.0 中失败(使用相同的代码)
- 我的IDE是Android工作室
我找到了解决这个问题的方法:
例如,您只需在 API 21+ 上将 java/lang/Object
替换为您的 java 对象 class,
jclass localClass = env->FindClass("com/example/YourLocalClass");
,
从日志中,我们可以知道对象 class 不是 yourJavaLocalObject class.