2011-08-10 81 views
0

在我的Java代碼中,我使用getCustomCode()方法創建了MyException類(擴展Exception類)。Android - JNI - 通過JNI恢復MyException成員

在我的C++代碼中,當我調用拋出MyException的Java方法時,我需要執行此異常的getCustomCode以正確處理異常。

要完成,我執行拋出MyException這段代碼的Java方法:

jint result = env->CallIntMethodA(javaObj, methodId, params); 

權此行中我檢查JavaException與此代碼後:

jthrowable exc = env->ExceptionOccurred(); 
if(exc) 
{ 
    jclass objCls = env->FindClass("com/mycompany/myapp/exception/MyException"); 
    jmethodID codeMethod = env->GetMethodID(objCls, "getCustomCode", "()I"); 
    if(!objCls || !codeMethod){ ........ } 
    // Try to execute getCustomCode java method. 
    jint codeResult = env->CallIntMethod((jobject)exc, codeMethod); 
    ... 
    ... 
} 

但是,當我嘗試通過JNI執行getCustomCode失敗。 我做了一些檢查,用JNI方法IsAssignableFrom和IsInstanceOf,結果是:

jclass objCls = env->FindClass ("com/mycompany/myapp/exception/MyException"); 
jclass objThrowable = env->FindClass ("java/lang/Throwable"); 
if(env->IsAssignableFrom(objCls, objThrowable) == JNI_TRUE) { /* TRUE! */ } 

條件返回true,所以我的課是正確的。 另一個檢查:

jclass objCls = env->FindClass ("com/mycompany/myapp/exception/MyException"); 
jclass objThrowable = env->FindClass ("java/lang/Throwable"); 
if(env->IsInstanceOf((jobject)exc, objCls) == JNI_TRUE) { /* FALSE */ } 
if(env->IsInstanceOf((jobject)exc, objThrowable) == JNI_TRUE) { /* FALSE */ } 

兩個條件返回false,所以既不MyException也不Throwable的是EXC類!

那麼,什麼是可拋物體?我該如何將jThrowable對象投射到jobject才能訪問MyException成員? 這可能嗎?

謝謝!

回答

0

您很可能需要在env->FindClass(...)之前撥打env->ExceptionClear()等。在異常處於活動狀態時,不允許您調用大多數JNI方法,請參閱this page的第6.2.2節。出現未決異常時允許的功能列表:

ExceptionOccurred 
ExceptionDescribe 
ExceptionClear 
ExceptionCheck 
ReleaseStringChars 
ReleaseStringUTFchars 
ReleaseStringCritical 
Release<Type>ArrayElements 
ReleasePrimitiveArrayCritical 
DeleteLocalRef 
DeleteGlobalRef 
DeleteWeakGlobalRef 
MonitorExit