六、JNI-异常

2021-03-24  本文已影响0人  MrDecoder

#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);
上一篇 下一篇

猜你喜欢

热点阅读