ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
Native代码有两种方式处理发生的异常: * Native方法的实现可以选择立即返回,或者让Native方法的调用者处理异常。 * Native代码可以直接调用ExceptionClear清除当前异常并自己处理(这样Native的调用者就不必处理异常了)。 切记,在发起后续JNI调用之前,需要检查,处理并清除异常。如果发起一个JNI调用的时候已经发生了一个异常且这个异常没有被清除,除了少数函数(见11.8.2)可以被安全的调用 则该JNI调用的结果是未知的。这少数函数基本上都是JNI本来设计用来处理异常的以及用来释放虚拟机资源的函数。 通常在发生异常的时候我们有必要释放异常发生之前申请的资源。在以下示例中,Native函数首先调用GetStringChars获取一个字符串,然后在后续操作失败之后调用ReleaseStringChars释放字符串资源: ~~~ JNIEXPORT void JNICALL Java_pkg_Cls_f(JNIEnv *env, jclass cls, jstring jstr) { const jchar *cstr = (*env)->GetStringChars(env, jstr); if(!cstr){ return; } if(...) { /*exception occurred */ (*env)->ReleaseStringChars(env, jstr, cstr); return; } /* normal return */ (*env)->ReleaseStringChars(env, jstr, cstr); } ~~~ 第一个ReleaseStringChars是在发生异常的时候被调用的。在这里我们只是在发生异常之后释放了相关的资源然后立即返回,而并没有清除异常。