У меня есть уровень JNI в моем приложении. В некоторых случаях Java выдает исключение. Как я могу получить исключение Java в уровне JNI? У меня есть код что-то как следующим образом.
if((*(pConnDA->penv))->ExceptionCheck(pConnDA->penv))
{
(*(pConnDA->penv))->ExceptionDescribe(pConnDA->penv);
(*(pConnDA->penv))->ExceptionClear(pConnDA->penv);
}
Этот блок кода поймает только исключения JNI? Где описание исключения будет зарегистрировано консоль (stderr)? Как я получаю это в буфер, так, чтобы я мог передать его своему модулю регистратора?
Если вы вызываете метод 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-код никогда не увидит, - вместо этого он увидит ожидающий исключение.