У меня есть библиотека Java, которая выполняет ряд задач. И я зарегистрировал обработчик необработанных исключений по умолчанию, используя:
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
UncaughtExceptionHandler реализует UncaughtExceptionHandler
и только регистрировать информацию об ошибке в STDERR
,
Моя библиотека Java вызывается через JNI из кода C ++, а JNI вызывает его с помощью ExceptionCheck()
и зарегистрируйте ошибку как FATAL в C ++.
Проблема в:
Во время выполнения, когда есть RuntimeException
(или любое другое неисследованное исключение) происходит в моем коде Java, ошибка записывается в C ++ вместо моего JavaUncaughtExceptionHandler
зарегистрирован как обработчик необработанных исключений потока по умолчанию.
DefaultUncaughtExceptionHandler
на самом деле позвонили? Я знаю, прежде чем поток получил отключение, но когда конкретно в случае JNI. Вызывается ли это перед возвратом в C ++ или после завершения кода C ++). Я думаю, что это связано с управлением потоками в JNI, пожалуйста, поделитесь любой связанной информацией.try
/catch
блоки) Спасибо.
Похоже, вы говорите о 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 не «ловит» исключение), то я не помню, что происходит, но я не думаю, что это хорошо.
Других решений пока нет …