前言

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代码处理异常之前,异常会一直抛出。

例子

可以看Throw的例子。不重复了。

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。

参考文章

  1. 【JNI编程】JNI异常

  2. NDK中jni.h头文件完整内容

相关文章

暂无评论

none
暂无评论...