六、JNI-异常
2021-03-24 本文已影响0人
MrDecoder
- 概述
- 异常处理
#1. 概述
JNI层提供了一系列异常处理的函数,包括ExceptionOccurred,ExceptionDescribe,ExceptionClear以及ThrowNew等。
JNIEXPORT void JNICALL Java_com_nextlabs_hhu_myapplication_core_CatchThrow_nativeAccess
(JNIEnv *env, jobject obj) {
jclass clazz;
jmethodID mid;
jthrowable throwable;
clazz = env->GetObjectClass(obj);
if (clazz == nullptr) {
return;
}
mid = env->GetMethodID(clazz, "callback", "()V");
if (mid == nullptr) {
return;
}
env->CallVoidMethod(obj, mid);
throwable = env->ExceptionOccurred();
if (throwable) {
jclass expClass;
env->ExceptionDescribe();
env->ExceptionClear();
expClass = env->FindClass("java/lang/IllegalArgumentException");
if (expClass == nullptr) {
return;
}
env->ThrowNew(expClass, "Thrown from native code.");
}
}
#2. 异常处理
2.1 异常检验
有两种方式可以用来判断是否有错误发生:
- 大多数JNI函数通过返回值来进行错误判断。
- 第二种方式就是通过异常进行错误处理。
2.1.1 ExceptionCheck
判断是否有异常发生。
jboolean ExceptionCheck(JNIEnv *env);
2.1.2 ExceptionOccurred
判断是否有异常发生,异常保持待throw的状态直到Native层调用ExceptionClear或者Java层处理了异常。
jthrowable ExceptionOccurred(JNIEnv *env);
2.2 处理异常
2.2.1 Throw
根据obj构造java.lang.Throwable对象并抛出异常。
jint Throw(JNIEnv *env, jthrowable obj);
2.2.2 ThrowNew
jint ThrowNew(JNIEnv *env, jclass clazz,const char *message);
根据异常类clazz和对应的message信息构造新的异常对象并抛出异常。
2.2.3 ExceptionDescribe
通过系统错误日志譬如stderr打印异常的堆栈信息。
void ExceptionDescribe(JNIEnv *env);
2.2.4 ExceptionClear
清理任何待抛出的异常。如果当前没有任何待抛异常,那函数不产生任何作用。
void ExceptionClear(JNIEnv *env);