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层代码必须关注的事情,读者在编写代码时务小心对待。