前言

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
暂无评论...