Интерпретатор Java, подключенный к вашему текущему потоку, не работает, пока вы находитесь в коде JNI. Таким образом, нет способа обработать исключение на стороне Java (развернуть кадры стека, перехватить и т. Д.). Исключение Java создается как ожидающее и действительно генерируется, только когда вызов JNI возвращается в Java, и выполнение интерпретатора продолжается для вашего текущего потока Java.
Отключение подобного процесса подделывает этот процесс, но может оставить ваш код JNI внестабильное состояние: Java теперь работает, JNI не вернулся и все еще выполняет ваш код.
Мое предпочтительное решение - генерировать исключение Java, как вы делаете, и немедленно генерировать исключение C ++, которое является единственным (и должнобыть) пойман на границе JNI и сброшен. Исключение C ++ вызывается исключительно для того, чтобы вызвать раскручивание стека и быстрый чистый выход из вызова JNI.