私は少し周りgoogle'dして本当に私の質問のための良い答えを発見していない:ネイティブjniコードからjavaにエラー情報を返す慣習的な方法は何ですか?Java:jni呼び出しでネイティブコードのエラーを慣習的にどのように処理するのですか?
私は通常、デザインを選択してそれを使用しますが、このコードは5ミリ秒(約)毎に呼び出されるため、これを行うための慣習的な「効率的な」方法があるかどうか尋ねると思いました。 Javaで「エラーリターン」オブジェクトを作成し、JNIにそれを通過し、呼び出しごとに
:
私はそれを見る方法、私は4明白なオプションがあります。問題がある場合は、このオブジェクトのエラー記述にネイティブコードが入り、Javaコードがそれをチェックします。エラーは一般的なケースではないため、GCがクリーンアップするためのオブジェクトが多数作成され、99.99%は不要です。
#1と同様に、 "error return"オブジェクトをjavaメソッドの各メソッド呼び出しに繰り返し渡します各戻り値のJavaコードでエラーをチェックしてください。これは私には不愉快に思えるかもしれませんが、それは適切な選択肢でしょうか?
該当する場合、エラーの説明を含むオブジェクトをネイティブコードで作成し、戻り値としてjavaに戻します。 javaでの呼び出しの後、nullの戻り値を確認します。これは#1よりも無駄が少ないようですが、少し厄介なようです。
jniメソッドで単純に整数の戻り値を作成し、ネイティブコードの「終了」値に対応するintを返すだけです。すべての可能なネイティブ終了状態をJavaマップに列挙します。戻り値を '0'と比較し、必要に応じてこのマップのエラーを調べます。これは他のものよりも効率的ですが、ネイティブコードを変更すると誰かに戻って「エラーテーブル」を更新する必要があるため、もっと不器用です。
私は何か明白なものを見逃しているように感じます...そこには洞察力を提供することができる教師はいますか?
ありがとうございます!
必要な特定の機能はThrowNew(http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16104) –
です。私が書いたリンクが示すように、それは最初にスローする例外クラスを見つけることです。 – ewanm89
真。また、single-arg String以外のコンストラクタを使用して例外オブジェクトをスローする場合は、それを手動で構築し、Throwを使用します。 –