在我的Java代码中,我使用getCustomCode()方法创建了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对象是什么呢?如何将jthrowable对象转换为jobject以访问MyException成员?有可能吗?
谢谢!
发布于 2012-04-05 06:53:17
你很可能需要在env->FindClass(...)之前调用env->ExceptionClear(),等等。当一个异常处于活动状态时,你是不允许调用大多数JNI方法的,参见this page的6.2.2节。存在挂起异常时允许的函数列表:
ExceptionOccurred
ExceptionDescribe
ExceptionClear
ExceptionCheck
ReleaseStringChars
ReleaseStringUTFchars
ReleaseStringCritical
Release<Type>ArrayElements
ReleasePrimitiveArrayCritical
DeleteLocalRef
DeleteGlobalRef
DeleteWeakGlobalRef
MonitorExithttps://stackoverflow.com/questions/7018940
复制相似问题