目录
前言
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。
参考文章
《》
《》
© 版权声明