Java UncaughtExceptionHandler не получил никаких исключений при использовании JNI

У меня есть библиотека Java, которая выполняет ряд задач. И я зарегистрировал обработчик необработанных исключений по умолчанию, используя:

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

UncaughtExceptionHandler реализует UncaughtExceptionHandler и только регистрировать информацию об ошибке в STDERR,

Моя библиотека Java вызывается через JNI из кода C ++, а JNI вызывает его с помощью ExceptionCheck() и зарегистрируйте ошибку как FATAL в C ++.

Проблема в:

Во время выполнения, когда есть RuntimeException (или любое другое неисследованное исключение) происходит в моем коде Java, ошибка записывается в C ++ вместо моего JavaUncaughtExceptionHandler зарегистрирован как обработчик необработанных исключений потока по умолчанию.

  1. Это исключительное поведение?
  2. Когда будет DefaultUncaughtExceptionHandler на самом деле позвонили? Я знаю, прежде чем поток получил отключение, но когда конкретно в случае JNI. Вызывается ли это перед возвратом в C ++ или после завершения кода C ++). Я думаю, что это связано с управлением потоками в JNI, пожалуйста, поделитесь любой связанной информацией.
  3. В любом случае я могу перехватить все исключения в моем коде Java (другой альтернативный способ, кроме как поставить try/catch блоки)

Спасибо.

7

Решение

Похоже, вы говорите о API вызова Java (то есть, вы вызываете методы Java из программы на C ++, в отличие от простого JNI, где вызовы идут другим путем.)

Я не большой эксперт, но я работал с Java Invocation API.

Насколько я знаю, необработанный обработчик исключений будет вызываться только тогда, когда исключение выдается потоком Java run() метод. Но там не любой run() метод в потоке, который был создан кодом C / C ++.

Я написал C, а не C ++, поэтому все мои звонки в Java выглядели так

jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...);

Когда он вызывается из C, он всегда возвращается, но перед тем, как использовать return_value, вы должны проверить, возвращал ли метод нормально или выдал исключение.

Если оно вызвало исключение, то исключение не может быть «необработанным», если код C не вызывает (*env)->ExceptionClear(env) (то есть, если код на C не «ловит» исключение), то я не помню, что происходит, но я не думаю, что это хорошо.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]