2016-08-24 7 views
6

일련의 작업을 실행하는 Java 라이브러리가 있습니다.Java UncaughtExceptionHandler가 JNI를 사용하여 예외를 가지고 있지 않음

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

수 있던 uncaughtExceptionHandler는 UncaughtExceptionHandler 구현 만 STDERR에 오류 정보를 로그 : 그리고 내가 사용하는 기본 캐치되지 않는 예외 핸들러를 등록했다.

Java 라이브러리는 C++ 코드에서 JNI를 통해 호출되며 JNI는 ExceptionCheck()으로 호출하고 C++에서 FATAL로 오류를 기록합니다.

문제는 : 런타임에서

하는 RuntimeException (또는 다른 캐치되지 않는 예외), 오류가 C++에서 캡처있어 내 자바 코드에서 일어나는있을 때 대신 스레드 기본 캐치되지 않는 예외 핸들러로 등록 내 JavaUncaughtExceptionHandler의 .

  1. 예외가 있습니까?
  2. 실제로 언제 DefaultUncaughtExceptionHandler이 호출 될 예정입니까? 스레드가 종료되기 전에 알아,하지만 특히 JNI의 경우. 그것은 C++로 돌아 오기 전에 또는 C++ 코드가 끝난 후에 호출됩니다.) JNI의 스레드 관리와 관련이 있다고 생각합니다. 관련된 모든 정보도 공유하십시오.
  3. 내가 너무 내 자바 코드에있는 모든 예외 (A try/catch 블록을 넣어 제외하고 기타 다른 방법)

감사를 잡을 수 어쨌든입니다.

답변

1
당신이이 자바 호출 API에 대해 얘기처럼 소리

(즉, 당신이 C++ 프로그램 내에서 자바 메소드를 호출하는 호출이 다른 길을 갈 간단한 JNI 반대로.)

I 큰 전문가는 아니지만 Java Invocation API로 작업했습니다.

내가 아는 한, 캐치되지 않는 예외 처리기는 Java 스레드의 run() 메서드에 의해 예외가 throw 될 때만 호출됩니다. 그러나 거기에 어떤 run() 메서드는 C/C++ 코드에 의해 만들어진 스레드가 아닙니다.

나는 그래서이 C에서라고하면 자바로 내 전화는 모두 항상 반환

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

처럼 보였다,하지만 당신은 return_value를 사용하기 전에, 당신은 방법 여부를 확인해야 C가 아니라 C++를 썼다 정상적으로 반환되거나 예외가 발생했습니다.

예외가 발생하면 예외가 "캐치되지 않음"이 될 수 없습니다. C 코드가 (*env)->ExceptionClear(env)을 호출하지 않으면 (즉, C 코드가 예외를 "catch"하지 않으면) 무슨 일이 일어 났는지 기억하지 못한다.하지만 나는 그것이 좋다고 생각하지 않는다.

+0

제임스, 설명해 주셔서 감사합니다. 매우 유용합니다. 우리는 jenv.CheckException (...) 메소드를 사용하여 Java 메소드를 호출하고 예외는 C++에서 캡처됩니다. 따라서 코드는 실행하는 것이 안전하다고 생각하지만 C 대신 Java에서 모든 예외를 기록하려고합니다. 그러나 UncaughtExceptionHandler에서는이를 수행 할 수 없습니다. – user788767