【问题标题】:Android JNI exception handlingAndroid JNI 异常处理
【发布时间】:2015-11-18 10:19:10
【问题描述】:

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

有人可以建议一个示例(完成一个),因为我无法实现它。请提供完整的源代码。如果您需要更多信息,请询问我。

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 你能为我推荐任何 jni 在线指南或书籍吗?在网上搜索特定问题并不总是理想的。 oracle 显示了一些 jni api 文档,但不确定它是否很好,因为我想要一些适用于 android 的东西。
  • 我喜欢:盛亮的《Java Native Interface: Programmer's Guide and Specification》,但不知道网上有没有。
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2019-10-17
相关资源
最近更新 更多