目录
前言
JNI中也存在异常,如果出现异常不处理就会让程序崩溃。因此JNI中定义了异常相关函数用于处理异常。下面就介绍一写常用的异常处理函数。
正文
Throw
- # env : JNI接口指针
- # obj : 一个java.lang.Throwable对象
- # 如果成功时返回0;失败时为负值
- jint (*Throw)(JNIEnv*, jthrowable);
导致抛出java.lang.Throwable对象。
例子
- # 获取异常
- jthrowable jthrow = env->ExceptionOccurred();
- # 抛出异常
- env->Throw(jthrow);
ThrowNew
- # env : JNI接口指针
- # clazz : java.lang.Throwable的子类
- # message : 用于构造java.lang.Throwable对象的消息。
- # 如果成功时返回0;失败时为负值
- jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);
使用message指定的消息从指定的类构造一个异常对象,并导致抛出该异常。
例子
- # java.lang.NullPointerException
-
- jclass nullExceptionCls = env->FindClass("java/lang/NullPointerException");
- if (NULL != nullExceptionCls) {
- env->ThrowNew(nullExceptionCls, "Throw New Exception: NULL by ");
- }
- JNI GetFieldID called with pending exception java.lang.NullPointerException: Throw New Exception: NULL by
ExceptionOccurred
- # env : JNI接口指针
- # 返回当前正在抛出的异常对象,否则返回NULL
- jthrowable ExceptionOccurred(JNIEnv *env);
确定是否抛出异常。在本地代码调用ExceptionClear()或Java代码处理异常之前,异常会一直抛出。
例子
ExceptionDescribe
- # env:JNI接口指针
- void ExceptionDescribe(JNIEnv *env);
将堆栈的异常和回溯打印到系统错误报告通道,例如stderr。这是为调试提供的便利例程。
例子
- env->ExceptionDescribe();
将堆栈的异常和回溯打印到系统错误报告通道,下面只是日志的一部分。
- native_jni_init ExceptionCheck
- java.lang.NoSuchFieldError: no "Z" field "mBooleanValueDDD" in class "Lcom/biumall/dynamic/one/Hello;" or its superclasses
ExceptionClear
- # env:JNI接口指针
- void ExceptionClear(JNIEnv *env);
清除当前正在抛出的任何异常。 如果当前没有抛出异常,则此例程无效。
例子
- env->ExceptionClear();
清除异常,就不会奔溃。
FatalError
- # env:JNI接口指针
- # msg:错误消息。该字符串以修改后的UTF-8编码
- void FatalError(JNIEnv *env, const char *msg);
引发致命错误,并且不希望VM恢复。此功能不返回。
例子
- //终止并退出是
- env->FatalError("Bad error by !");
应用会抛出异常:
- jni_internal.cc:616] JNI FatalError called: Bad error by !
- runtime.cc:558] Runtime aborting...
ExceptionCheck
- # env:JNI接口指针
- # 存在挂起异常时返回JNI_TRUE; 否则,返回JNI_FALSE
- jboolean ExceptionCheck(JNIEnv *env);
检查挂起的异常。
例子
- jboolean hasError = env->ExceptionCheck();
如果有异常hasError=1,否则hasError=0。
参考文章
《》
《》
历史上的今天
© 版权声明