五.处理本机代码中的异常
为了处理以Java代码实现的方法执行中抛出的异常,或者是以本机代码编写的方法抛出的Java异常,JNI提供了Java异常机制的钩子程序。该机制与C/C++中常规函数实现的标准错误处理无关。JNI提供一个函数集来在本机代码中检查、分析和处理Java异常。
(1).如果一个异常已经抛出,下面的函数返回JNI_TRUE,否则返回JNI_FALSE:
jboolean ExceptionCheck();
/*如:当异常发生时,清理并抛出自定义异常*/ if(env->ExceptionCheck()) { env->ExceptionClear();//清除异常 env->ThrowNew(env->FindClass("java/lang/Exception"),"xx异常"); }
(2).ExceptionOccurred函数获取正在被抛出异常的一个本地引用。本机代码或者Java代码必须处理该异常:
jthrowable ExceptionOccurred();
(3).ExceptionDescribe函数打印有关刚刚被抛出到标准错误输出中的异常信息。该信息包括一个栈追踪信息:
void ExceptionDescribe();
(4).ExceptionClear函数清理一个刚刚抛出的异常:
(5).Throw 函数抛出一个已经创建的异常。如果异常成功抛出,返回0;否则返回一个负值:
jint Throw(jthrowable obj);
/*可以这样使用:手动抛出异常,然后在本机或Java代码中处理*/ jthrowable mException = NULL; mException = env->ExceptionOccurred(); if (mException != NULL) { env->Throw(mException); /*或抛出自定义异常 env->ThrowNew(env->FindClass("java/lang/Exception"), "xxx异常"); */ //最后别忘了清除异常,不然还是会导致VM崩溃 env->ExceptionClear(); return -1; }
(6).ThrowNew函数基于clazz创建一个异常,它应该是继承自Throwable,并且异常文本是由msg(按照UTF-8)指定。如果异常的构造以及抛出成功,返回0;否则返回一个负值。
jint ThrowNew(jclass clazz,const char *msg);
/*如:在可能出错的地方抛出自定义异常,然后在本机代码或者Java代码中处理*/ env->ThrowNew(env->FindClass("java/lang/Exception"), "xxx异常");
(7)FatalError函数会生成致命错误信号。一个致命错误是特指无法恢复的情况。VM在调用该函数之后将会关闭:
void FatalError(const char *msg);
|