1

私は少しグーグルで検索しましたが、私の質問に対する適切な答えが実際には見つかりませんでした: ネイティブの jni コードから Java にエラー情報を返す慣習的な方法は何ですか?

私は通常、デザインを選んでそれを使用しますが、このコードは 5 ミリ秒ごとに (約) 呼び出されるため、これを行うための慣習的な「クリーンで効率的な」方法があるかどうかを尋ねたいと思いました。

私の見方では、次の 4 つの明白なオプションがあります。

  1. 呼び出しごとに、java で「エラー リターン」オブジェクトを作成し、それを JNI に渡します。問題がある場合、ネイティブ コードはこのオブジェクトにエラーの説明を入力し、Java コードは戻り時にそれをチェックします。エラーは一般的なケースではないため、GC がクリーンアップするために多くのオブジェクトが作成され、それらの 99.99% は不要です。

  2. #1 と同様に、Java クラスに単一の「エラー リターン」オブジェクトを作成し、各メソッド呼び出しに何度も渡されます。エラーが返されるたびに Java コードで確認してください。これは私には危険に思えますが、おそらくそれは適切なオプションですか?

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

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

明らかな何かが欠けているように感じます...洞察を提供できるグルがそこにいますか?

ありがとう!

4

2 に答える 2

4

Java 例外をスローします: http://java.sun.com/docs/books/jni/html/exceptions.html ?

于 2009-04-28T02:06:04.547 に答える
1

あなたが指摘した方法について:

  1. おっしゃったように、これにより多くの割り当て/割り当て解除呼び出しが生成されます。
  2. ネイティブ コードを呼び出すスレッドが複数ある場合、この方法は機能しません。
  3. これは、戻り値が他に必要ないことを前提としています。エラーオブジェクトがいつどこで「解放」されるかという問題もあります。
  4. 戻り値を他の目的で使用しておらず、エラーに関する「追加の」情報が必要ないと仮定すると、これは良い解決策です。発生する可能性のあるエラーは、Java コードの更新で問題が発生するほど頻繁に変更されるべきではありません。

もちろん、戻り値必要な場合、および実際のエラーに関する詳細情報が必要な場合は、exceptionsを使用する必要があります。

于 2009-04-28T02:13:37.070 に答える