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