5


私はJNIを調べ始めましたが、ロードされたdllで問題が発生した場合、jvmはその場で終了する可能性があることを理解しています。
つまり、プロセスを保護することはできません。たとえば、例外をキャッチする場合などです。
したがって、私の理解が正しければ、私の質問は、jniを使用するときにこの状況に標準的なアプローチ/パターンがあるかどうかです。
言い換えると、jniを使用するプロセスは、これらの問題を回避するように設計されていますか?または、そのような問題は発生しないと予想されますか?

ありがとうございました。

4

3 に答える 3

3

はい、JVMは終了するだけです。これが、JNIコードのデバッグが非常に難しい理由の1つです。C ++コードを使用している場合は、例外を使用してから、それらをJava例外にマップできます。これにより、少なくともある程度のセキュリティが提供されますが、メモリアクセスの不良などには役立ちません。

アーキテクチャの観点から、コードをJNIから可能な限り切り離すことをお勧めします。C ++ / Cから完全にテスト可能なクラス/プロシージャ構造を作成し、JNIコードにすべての変換作業のみを実行させます。その後、JVMがクラッシュした場合は、少なくともどこを見なければならないかがわかります。

于 2011-02-10T20:07:30.490 に答える
1

原則は、マルチスレッドCアプリケーションと同じです。

  1. 常にすべての入力を徹底的にチェックしてください。
  2. 割り当てた一時メモリを常に解放します。
  3. 関数が再入可能であることを確認してください。
  4. 未定義の動作に依存しないでください。

Java仮想マシンは、ネイティブコードに対する追加の保護を提供しません。失敗したりリークしたりすると、VMに障害が発生したりリークしたりします。

于 2011-02-10T20:04:15.437 に答える
0

JNIライブラリでは、他のライブラリとまったく同じ範囲のエラー処理を行うことができます。

try/catchを使用できます。Windowsを使用している場合は、SEHを使用できます。Linuxを使用している場合は、sigactionを呼び出すことができます。

それでも、混乱してSIGSEGVが発生した場合、そのシグナルをキャッチしようとしているかどうかに関係なく、JVMはおそらくトーストです。

于 2011-02-11T01:10:48.090 に答える