Android JNI异常处理

4

我希望您能够在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不可用(因为应用程序开发人员没有相应的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
可能是如何捕获JNI/Java异常的重复问题。 - Selvin
1个回答

6
你可以在进行可能会抛出异常的jni操作后调用以下代码:
bool checkExc(JNIEnv* env) {
 if(env->ExceptionCheck()) {
  env->ExceptionDescribe(); // writes to logcat
  env->ExceptionClear();
  return true;
 }
 return false;
}

你能否为我推荐一些 JNI 的在线指南或书籍?在网上搜索特定问题并不总是理想的选择。Oracle 提供了一些 JNI API 文档,但我不确定它是否非常好,因为我想要适用于 Android 的内容。 - test test
我喜欢《Java Native Interface: Programmer's Guide and Specification》这本书,它是由Sheng Liang编写的,但我不确定它是否可以在线获取。 - marcinj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接