2011-08-10 50 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