异常操作
? ?這個JNIENV接口提供了一套與異常相關的函數。
? ?public class JavaClass {
? ?/**
? ? * Throwing method.
? */
? ?private void throwingMethod() throws NullPointerException {
? ?throw new NullPointerException("Null pointer");
? ?}
? ?/**
? ?* Access methods native method.
? */
? private native void accessMethods();
? }
? ?這個accessMethods本地方法需要明確的做異常處理,當調用throwingMethod方法。這個JNI提供了ExceptionOccurred方法來查詢虛擬機是否有異常。這個異常處理需要明確的使用ExceptionClear函數來清除它。
??jthrowable ex;
? ...
?(*env)->CallVoidMethod(env, instance, throwingMethodId);
?ex = (*env)->ExceptionOccurred(env);
?if (0 != ex) {
?(*env)->ExceptionClear(env);
?/* Exception handler. */
?}
拋出異常
這JNI允許本地的代碼來拋出異常。因為異常時Java類,這必須首先使用FindClass函數來獲得。這個ThrowNew函數能夠被用來初始化和拋出這新的異常。
? jclass clazz;
? ...
? clazz = (*env)->FindClass(env, "java/lang/NullPointerException");
? if (0 ! = clazz) {
? ? ? ? ?(*env)->ThrowNew(env, clazz, "Exception message.");
? }
本地函數的代碼執行并不在虛擬機的控制下,拋出一個異常并不會阻止本地函數的執行和把控制轉到異常處理器。基于拋出的 異常,本地方法應該釋放任何已經分配的本地資源,例如內存等。
總結
- 上一篇: Direct Byte Buffer的操
- 下一篇: 局部和全局引用的操作