Android - JNI - Восстановление членов MyException через JNI - PullRequest
0 голосов
/ 11 августа 2011

В моем Java-коде я создаю класс MyException (расширяющий класс Exception) с помощью метода getCustomCode ().

В моем коде C ++, когда я вызываю метод Java, который выдает MyException, мне нужно выполнить getCustomCode этого исключения, чтобы правильно обработать исключение.

Для этого я выполняю метод Java, который генерирует MyException с этим кодом:

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);
    ...
    ...
}

Но, когда я пытаюсь выполнить getCustomCode через JNI, происходит сбой. Я сделал несколько проверок с методами 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 объект к рабочему объекту для доступа к членам MyException? Является ли это возможным?

Спасибо!

1 Ответ

0 голосов
/ 05 апреля 2012

Скорее всего, вам нужно вызвать env->ExceptionClear() до env->FindClass(...) и т. Д. Вы не можете вызывать большинство методов JNI, когда исключение активно, см. Раздел 6.2.2 на этой странице .Список разрешенных функций при наличии ожидающего исключения:

ExceptionOccurred
ExceptionDescribe
ExceptionClear
ExceptionCheck
ReleaseStringChars
ReleaseStringUTFchars
ReleaseStringCritical
Release<Type>ArrayElements
ReleasePrimitiveArrayCritical
DeleteLocalRef
DeleteGlobalRef
DeleteWeakGlobalRef
MonitorExit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...