В моем 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?
Является ли это возможным?
Спасибо!