2016-08-24 5 views
6

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

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 блоков)

Спасибо так много.

ответ

1

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

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

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

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

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

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

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

+0

Джеймс, спасибо за ваше разъяснение, очень полезно. Мы вызываем Java-метод, используя метод jenv.CheckException (...), и исключение записывается в C++. Поэтому я считаю, что код безопасен для запуска, но мы просто хотим регистрировать все исключения в Java вместо C. Однако, похоже, это не может быть достигнуто UncaughtExceptionHandler. – user788767