我需要在JNI代码中实现异常处理.我不擅长jni而且找不到任何好的例子.所以,请提供完整的示例.
这就是我在做的事情:
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
jint result = -1;
g_JavaVM = vm;
if (vm->GetEnv((void **) &envLocal, JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
jclass clazz;
**clazz = envLocal->FindClass("com/graphics/myclass/MyClass");**
if (clazz == NULL)
__android_log_print(ANDROID_LOG_ERROR, "MyClass",
"clazz value is null");
g_clazz = (jclass) envLocal->NewGlobalRef(clazz);
// STEP 3/3 : Delete the no longer needed local reference
envLocal->DeleteLocalRef(clazz);
result = JNI_VERSION_1_6;
return result;
}
现在我有一个需要,如果这个MyClass不可用(因为app开发人员没有相应的jar文件)那么,应该没有任何应用程序崩溃.
使用System.LoadLibrary(“libmyclass.so”)和此“com / graphics / myclass / MyClass”类加载库时,将调用JNI_OnLoad.
目前,如果应用程序中未包含此jar,则会导致应用程序崩溃并出现以下异常
F/art (14708): sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception 'java.lang.ClassNotFoundException' thrown in unknown throw location
F/art (14708): sart/runtime/check_jni.cc:65] in call to NewGlobalRef
F/art (14708): sart/runtime/check_jni.cc:65] from java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String)
F/art (14708): sart/runtime/check_jni.cc:65] "main" prio=5 tid=1 Runnable
我需要的是这个异常由android处理,它应该在JNI_OnLoad中处理,以便应用程序不会崩溃.我不希望java处理异常.
所以我的想法是,如果我抓住“clazz = envLocal-> FindClass(”com / graphics / systemOp / SystemOp“)抛出的异常;”在此之后在JNI_OnLoad中处理.
有人可以建议一个例子(完整的),因为我无法实现它.有完整的源代码请.问我是否需要更多信息.
最佳答案 执行可能抛出的jni操作后,您可以调用以下代码:
bool checkExc(JNIEnv* env) {
if(env->ExceptionCheck()) {
env->ExceptionDescribe(); // writes to logcat
env->ExceptionClear();
return true;
}
return false;
}