2016-08-24 13 views
6

私は一連のタスクを実行するJavaライブラリを持っています。そして、私が使用してデフォルトのキャッチされない例外ハンドラを登録:Java UncaughtExceptionHandlerにJNIを使​​用した例外がありません

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

たuncaughtExceptionHandlerはUncaughtExceptionHandlerを実装し、唯一STDERRにエラー情報を記録します。

JavaライブラリはC++コードからJNIを介して呼び出され、JNIはExceptionCheck()で呼び出し、エラーをFATALとしてC++に記録します。

問題がある:ランタイムで

RuntimeException(または任意の他の捕捉されない例外)は、エラーがC++で撮影してしまった私のJavaコードで起こるがありますとき、代わりに、スレッドのデフォルトキャッチされない例外ハンドラとして登録された私のJavaUncaughtExceptionHandlerの。

  1. これは例外的な動作ですか?
  2. DefaultUncaughtExceptionHandlerは実際にいつ呼び出されますか?スレッドがシャットダウンする前に知っていますが、具体的にはJNIの場合です。それはC++に戻る前に、またはC++コードが終了した後に呼び出されますか?)私はそれがJNIのスレッド管理に関係していると思うので、関連する情報も共有してください。
  3. 私はそんなに私のJavaコードですべての例外(try/catchブロックを置く除いて、他の代替方法)

感謝をキャッチすることができますとにかくあります。

答えて

1

あなたはのJava呼び出しAPIについて話しているようですね(呼び出しが他の道を行くシンプルなJNIとは対照的に、つまり、あなたは、C++プログラム内からJavaメソッドを呼び出している。)

I私は大きな専門家ではありませんが、私はJava Invocation APIを使って作業しました。

私が知る限り、キャッチされない例外ハンドラは、Javaスレッドのrun()メソッドによって例外がスローされたときにのみ呼び出されます。しかし、は、のいずれのrun()も、C/C++コードで作成されたスレッドではありません。

私はそれがCから呼ばれていたときのJavaへの私の呼び出しはすべて

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

のように見えたので、それは常に返しますが、あなたはreturn_valueを使用する前に、あなたが方法かどうかを確認する必要があり、C、いないC++を書きました正常に返されるか、または例外がスローされます。

例外がスローされた場合、例外が「キャッチされない」ことはありません.Cコードが(*env)->ExceptionClear(env)をコールしない場合(つまり、Cコードが例外を「キャッチ」しない場合)何が起こったのか覚えていないが、それは良いとは思わない。

+0

James、あなたの説明のために非常に多くの、非常に有用です。 jenv.CheckException(...)メソッドを使用してJavaメソッドを呼び出すと、例外はC++で取得されます。コードは実行するのが安全だと思いますが、CではなくJavaですべての例外をログに記録したいだけですが、UncaughtExceptionHandlerでは実現できないようです。 – user788767

関連する問題