2.4.8 JNI中的异常处理
JNI中也有异常,不过它和C++、Java的异常不太一样。如果调用JNIEnv的某些函数出错了,则会产生一个异常,但这个异常不会中断本地函数的执行,直到从JNI层返回到Java层后,虚拟机才会抛出这个异常。虽然在JNI层中产生的异常不会中断本地函数的运行,但一旦产生异常后,就只能做一些资源清理工作了(例如释放全局引用,或者ReleaseStringChars)。如果这时调用除上面所说函数之外的其他JNIEnv函数,则会导致程序死掉。
来看一个和异常处理有关的例子,代码如下所示:
[—>android_media_MediaScanner.cpp:MyMediaScannerClient的scanFile函数]
virtual bool scanFile(const char*path,long long lastModified,
long long fileSize)
{
jstring pathStr;
//NewStringUTF调用失败后,直接返回,不能再干别的事情了。
if((pathStr=mEnv->NewStringUTF(path))==NULL)return false;
……
}
JNI层函数可以在代码中截获和修改这些异常,JNIEnv提供了三个函数给予帮助:
ExceptionOccured函数,用来判断是否发生异常。
ExceptionClear函数,用来清理当前JNI层中发生的异常。
ThrowNew函数,用来向Java层抛出异常。
异常处理是JNI层代码必须关注的事情,读者在编写代码时务小心对待。