2009-04-28 1 views
1

私は少し周りgoogle'dして本当に私の質問のための良い答えを発見していない:ネイティブjniコードからjavaにエラー情報を返す慣習的な方法は何ですか?Java:jni呼び出しでネイティブコードのエラーを慣習的にどのように処理するのですか?

私は通常、デザインを選択してそれを使用しますが、このコードは5ミリ秒(約)毎に呼び出されるため、これを行うための慣習的な「効率的な」方法があるかどうか尋ねると思いました。 Javaで「エラーリターン」オブジェクトを作成し、JNIにそれを通過し、呼び出しごとに

  1. 私はそれを見る方法、私は4明白なオプションがあります。問題がある場合は、このオブジェクトのエラー記述にネイティブコードが入り、Javaコードがそれをチェックします。エラーは一般的なケースではないため、GCがクリーンアップするためのオブジェクトが多数作成され、99.99%は不要です。

  2. #1と同様に、 "error return"オブジェクトをjavaメソッドの各メソッド呼び出しに繰り返し渡します各戻り値のJavaコードでエラーをチェックしてください。これは私には不愉快に思えるかもしれませんが、それは適切な選択肢でしょうか?

  3. 該当する場合、エラーの説明を含むオブジェクトをネイティブコードで作成し、戻り値としてjavaに戻します。 javaでの呼び出しの後、nullの戻り値を確認します。これは#1よりも無駄が少ないようですが、少し厄介なようです。

  4. jniメソッドで単純に整数の戻り値を作成し、ネイティブコードの「終了」値に対応するintを返すだけです。すべての可能なネイティブ終了状態をJavaマップに列挙します。戻り値を '0'と比較し、必要に応じてこのマップのエラーを調べます。これは他のものよりも効率的ですが、ネイティブコードを変更すると誰かに戻って「エラーテーブル」を更新する必要があるため、もっと不器用です。

私は何か明白なものを見逃しているように感じます...そこには洞察力を提供することができる教師はいますか?

ありがとうございます!

答えて

4

Javaの例外をスロー:http://java.sun.com/docs/books/jni/html/exceptions.html?あなたが指摘した方法について

+0

必要な特定の機能はThrowNew(http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16104) –

+0

です。私が書いたリンクが示すように、それは最初にスローする例外クラスを見つけることです。 – ewanm89

+0

真。また、single-arg String以外のコンストラクタを使用して例外オブジェクトをスローする場合は、それを手動で構築し、Throwを使用します。 –

1

  1. あなたが言及したように、これは、割り当て/割り当て解除コールの多くを生成します。
  2. ネイティブコードを呼び出すスレッドが2つ以上ある場合、このメソッドは機能しません。
  3. これは、他のものに対して戻り値を必要としないことを前提としています。あなたのエラーオブジェクトがいつどこで「解放」されたのかという疑問もあります。
  4. 戻り値を何も使用しておらず、エラーに関する「余分な」情報を必要としないとすれば、これは良い解決策です。発生する可能性のあるエラーは、頻繁に変更してJavaコードを更新する際に問題を生じることはありません。もちろん

あなたが場合、はあなたの戻り値を必要とし、あなたが実際のエラーに関するより詳細な情報が必要な場合、あなたはexceptionsを使用する必要があります。

+1

私は技術的には、Javaでは、戻り値を使用するよりも例外をスローするのが通例だと思った? – ewanm89

+0

これはJavaで書かれていますが、一度ネイティブコードを呼び出すと、それはあなたが正確に何を呼んでいるかによって決まります。 –

+0

このネイティブコードでは、各メソッドは成功または失敗の値を返し、出力は渡された参照/ポインタに取り込まれます。だから、私はまだ私のソリューションのためにそのモードで考えていました。答えをありがとう! – Decker

関連する問題