美文网首页
六、JNI-异常

六、JNI-异常

作者: MrDecoder | 来源:发表于2021-03-24 17:40 被阅读0次
  • 概述
  • 异常处理

#1. 概述

JNI层提供了一系列异常处理的函数,包括ExceptionOccurred,ExceptionDescribe,ExceptionClear以及ThrowNew等。

JNIEXPORT void JNICALL Java_com_nextlabs_hhu_myapplication_core_CatchThrow_nativeAccess
        (JNIEnv *env, jobject obj) {
    jclass clazz;
    jmethodID mid;
    jthrowable throwable;

    clazz = env->GetObjectClass(obj);
    if (clazz == nullptr) {
        return;
    }
    mid = env->GetMethodID(clazz, "callback", "()V");
    if (mid == nullptr) {
        return;
    }
    env->CallVoidMethod(obj, mid);

    throwable = env->ExceptionOccurred();
    if (throwable) {
        jclass expClass;
        env->ExceptionDescribe();
        env->ExceptionClear();

        expClass = env->FindClass("java/lang/IllegalArgumentException");
        if (expClass == nullptr) {
            return;
        }
        env->ThrowNew(expClass, "Thrown from native code.");
    }
}

#2. 异常处理

2.1 异常检验

有两种方式可以用来判断是否有错误发生:

  1. 大多数JNI函数通过返回值来进行错误判断。
  2. 第二种方式就是通过异常进行错误处理。
2.1.1 ExceptionCheck

判断是否有异常发生。

jboolean ExceptionCheck(JNIEnv *env);
2.1.2 ExceptionOccurred

判断是否有异常发生,异常保持待throw的状态直到Native层调用ExceptionClear或者Java层处理了异常。

jthrowable ExceptionOccurred(JNIEnv *env);
2.2 处理异常
2.2.1 Throw

根据obj构造java.lang.Throwable对象并抛出异常。

jint Throw(JNIEnv *env, jthrowable obj);
2.2.2 ThrowNew
jint ThrowNew(JNIEnv *env, jclass clazz,const char *message);

根据异常类clazz和对应的message信息构造新的异常对象并抛出异常。

2.2.3 ExceptionDescribe

通过系统错误日志譬如stderr打印异常的堆栈信息。

void ExceptionDescribe(JNIEnv *env);
2.2.4 ExceptionClear

清理任何待抛出的异常。如果当前没有任何待抛异常,那函数不产生任何作用。

void ExceptionClear(JNIEnv *env);

相关文章

  • 六、JNI-异常

    概述 异常处理 #1. 概述 JNI层提供了一系列异常处理的函数,包括ExceptionOccurred,Exce...

  • JNI-从jvm源码分析Thread.interrupt的系统级

    JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理[https://www.cnblo...

  • 六、异常

    一、异常的基本概念 程序运行过程中,由于一个不可能执行的操作而导致的程序中断。 “一个异常是在一个程序执行过程中出...

  • JNI-注册方式

    Java调用Native方法前,需要注册,将指定的Native方法与so中对应的方法绑定起来。 注册分为静态注册和...

  • Java(六) 异常

    Java 中的异常处理 在Java 中 通过 Throwable及其子类描述各种不同的异常类型 Throwab...

  • Media Module之Camera(三) Camera预览

    分析Camera预览的过程,我是通过从底层向上层分析的,从jni->Native->HAL->v4l2->java...

  • 七、JNI-调用接口

    概述 库和版本管理 Invocation API 示例 #1. 概述 Invocation API的作用在于如何把...

  • JNI-动态库的函数注册

    JNI-动态库的函数注册 时光荏苒,距离上次的文章已经3年多了。那这3年干啥了呢?平凡生活,在人间凑数。 来吧,展...

  • Dart 2(六)异常

    异常 您的Dart代码可以抛出并捕获异常。异常是表示发生了意外的错误。如果没有捕获异常,引发异常的隔离程序将被挂起...

  • 六、mysql连接异常

    今天遇到的bug如下: 问题的原因在于我为了装逼安装的是最新版本的mysql:8.0.15 但是我的mysql连接...

网友评论

      本文标题:六、JNI-异常

      本文链接:https://www.haomeiwen.com/subject/xkvhhltx.html