2.4.8 JNI中的异常处理
最后更新于:2022-04-02 05:48:29
JNI中也有异常,不过它和C++、Java的异常不太一样。当调用JNIEnv的某些函数出错后,会产生一个异常,但这个异常不会中断本地函数的执行,直到从JNI层返回到Java层后,虚拟机才会抛出这个异常。虽然在JNI层中产生的异常不会中断本地函数的运行,但一旦产生异常后,就只能做一些资源清理工作了(例如释放全局引用,或者ReleaseStringChars)。如果这时调用除上面所说函数之外的其他JNIEnv函数,则会导致程序死掉。
来看一个和异常处理有关的例子,代码如下所示:
**android_media_MediaScanner.cpp::MyMediaScannerClient的scanFile函数**
~~~
virtualbool 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层代码必须关注的事情,读者在编写代码时务小心对待。
';