Как поймать Исключение JNI/Java

У меня есть уровень JNI в моем приложении. В некоторых случаях Java выдает исключение. Как я могу получить исключение Java в уровне JNI? У меня есть код что-то как следующим образом.

if((*(pConnDA->penv))->ExceptionCheck(pConnDA->penv))
{
    (*(pConnDA->penv))->ExceptionDescribe(pConnDA->penv); 
    (*(pConnDA->penv))->ExceptionClear(pConnDA->penv);
}

Этот блок кода поймает только исключения JNI? Где описание исключения будет зарегистрировано консоль (stderr)? Как я получаю это в буфер, так, чтобы я мог передать его своему модулю регистратора?

26
задан Roland Illig 21 November 2011 в 22:18
поделиться

1 ответ

Если вы вызываете метод Java из jni, вызывая ExceptionCreat После этого вернется jni_true , если исключение было брошено Ява.

Если вы просто вызываете функцию JNI (например, FindClass ), ExceptionCreck скажут вам, если это не удалось таким образом, что оставляет в ожидании исключения (как FindClass будет делать по ошибке).

ExceptionDescribe выходы на STDERR. Нет удобного способа сделать его где-нибудь еще, но , но , но ExceptionCCCURRED дает вам jthrowable , если вы хотите играть с ним, или вы могли бы просто позволить ему добраться до Java и обрабатывать это там. Это обычный стиль:

jclass c = env->FindClass("class/does/not/Exist");
if (env->ExceptionCheck()) {
  return;
}
// otherwise do something with 'c'...

Обратите внимание, что не имеет значения, какое значение вы возвращаете; Вызов Java-код никогда не увидит, - вместо этого он увидит ожидающий исключение.

27
ответ дан 28 November 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: