安卓JNI异常处理

 2023-01-20    300  

问题描述

我需要在JNI代码中实现的异常处理.我不擅长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中处理.

有人可以建议一个示例(完成一个),因为我无法实施它.请使用完整的源代码.问我是否需要更多信息.

推荐答案

您可以在执行可能投掷的JNI操作后调用以下代码:

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

以上所述是小编给大家介绍的安卓JNI异常处理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26112.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。