前言

JNI中也存在异常,如果出现异常不处理就会让程序崩溃。因此JNI中定义了异常相关函数用于处理异常。下面就介绍一写常用的异常处理函数。

正文

Throw

  1. # env : JNI接口指针
  2. # obj : 一个java.lang.Throwable对象
  3. # 如果成功时返回0;失败时为负值
  4. jint       (*Throw)(JNIEnv*, jthrowable);
复制

导致抛出java.lang.Throwable对象。

例子
  1. # 获取异常
  2. jthrowable jthrow = env->ExceptionOccurred();
  3. # 抛出异常
  4. env->Throw(jthrow);
复制

ThrowNew

  1. # env : JNI接口指针
  2. # clazz : java.lang.Throwable的子类
  3. # message : 用于构造java.lang.Throwable对象的消息。
  4. # 如果成功时返回0;失败时为负值
  5. jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);
复制

使用message指定的消息从指定的类构造一个异常对象,并导致抛出该异常。

例子
  1. # java.lang.NullPointerException
  2. jclass nullExceptionCls = env->FindClass("java/lang/NullPointerException");
  3. if (NULL != nullExceptionCls) {
  4.   env->ThrowNew(nullExceptionCls, "Throw New Exception: NULL by ");
  5. }
复制
  1. JNI GetFieldID called with pending exception java.lang.NullPointerException: Throw New Exception: NULL by
复制

ExceptionOccurred

  1. # env : JNI接口指针
  2. # 返回当前正在抛出的异常对象,否则返回NULL
  3. jthrowable ExceptionOccurred(JNIEnv *env);
复制

确定是否抛出异常。在本地代码调用ExceptionClear()或Java代码处理异常之前,异常会一直抛出。

例子

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

ExceptionDescribe

  1. # env:JNI接口指针
  2. void ExceptionDescribe(JNIEnv *env);
复制

将堆栈的异常和回溯打印到系统错误报告通道,例如stderr。这是为调试提供的便利例程。

例子
  1. env->ExceptionDescribe();
复制

将堆栈的异常和回溯打印到系统错误报告通道,下面只是日志的一部分。

  1. native_jni_init ExceptionCheck
  2. java.lang.NoSuchFieldError: no "Z" field "mBooleanValueDDD" in class "Lcom/biumall/dynamic/one/Hello;" or its superclasses
复制

ExceptionClear

  1. # env:JNI接口指针
  2. void ExceptionClear(JNIEnv *env);
复制

清除当前正在抛出的任何异常。 如果当前没有抛出异常,则此例程无效。

例子
  1. env->ExceptionClear();
复制

清除异常,就不会奔溃。

FatalError

  1. # env:JNI接口指针
  2. # msg:错误消息。该字符串以修改后的UTF-8编码
  3. void FatalError(JNIEnv *env, const char *msg);
复制

引发致命错误,并且不希望VM恢复。此功能不返回。

例子
  1. //终止并退出是
  2. env->FatalError("Bad error by !");
复制

应用会抛出异常:

  1. jni_internal.cc:616] JNI FatalError called: Bad error by !
  2. runtime.cc:558] Runtime aborting...
复制

ExceptionCheck

  1. # env:JNI接口指针
  2. # 存在挂起异常时返回JNI_TRUE; 否则,返回JNI_FALSE
  3. jboolean ExceptionCheck(JNIEnv *env);
复制

检查挂起的异常。

例子
  1. jboolean hasError = env->ExceptionCheck();
复制

如果有异常hasError=1,否则hasError=0。

参考文章

  1. 【JNI编程】JNI异常

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

相关文章

暂无评论

none
暂无评论...