企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
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层代码必须关注的事情,读者在编写代码时务小心对待。