首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android - JNI -通过JNI恢复MyException成员

Android - JNI -通过JNI恢复MyException成员
EN

Stack Overflow用户
提问于 2011-08-11 06:59:43
回答 1查看 954关注 0票数 1

在我的Java代码中,我使用getCustomCode()方法创建了MyException类(扩展异常类)。

在我的C++代码中,当我调用抛出MyException的Java方法时,我需要执行这个异常的getCustomCode来正确处理这个异常。

为此,我使用下面的代码执行抛出MyException的Java方法:

代码语言:javascript
复制
jint result = env->CallIntMethodA(javaObj, methodId, params);

在这一行之后,我使用下面的代码检查JavaException:

代码语言:javascript
复制
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做了一些检查,结果是:

代码语言:javascript
复制
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,所以我的类是正确的。另一项检查:

代码语言:javascript
复制
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成员?有可能吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-04-05 06:53:17

你很可能需要在env->FindClass(...)之前调用env->ExceptionClear(),等等。当一个异常处于活动状态时,你是不允许调用大多数JNI方法的,参见this page的6.2.2节。存在挂起异常时允许的函数列表:

代码语言:javascript
复制
ExceptionOccurred
ExceptionDescribe
ExceptionClear
ExceptionCheck
ReleaseStringChars
ReleaseStringUTFchars
ReleaseStringCritical
Release<Type>ArrayElements
ReleasePrimitiveArrayCritical
DeleteLocalRef
DeleteGlobalRef
DeleteWeakGlobalRef
MonitorExit
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7018940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档