Android JNI异常处理

时间:2015-11-18 10:19:11

标签: android exception android-ndk java-native-interface

我需要在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中处理。

有人可以提出一个例子(完整的例子),因为我无法实现它。有完整的源代码请。问我是否需要更多信息。

1 个答案:

答案 0 :(得分:2)

执行可能抛出的jni操作后,您可以调用以下代码:

bool checkExc(JNIEnv* env) {
 if(env->ExceptionCheck()) {
  env->ExceptionDescribe(); // writes to logcat
  env->ExceptionClear();
  return true;
 }
 return false;
}