JNI 呼び出しからしてはいけないことはありますか? これは何?
たとえば、内部でブロッキングおよび非ブロッキング I/O 呼び出しを行う C++ ライブラリを使用する必要があります。
これらの場合に注意すべき注意事項はありますか? また、同じ機能がスクリプトによって提供されることも知っています (ただし、実際のスクリプト言語はわかりません)。それは(からスクリプトを呼び出すための)より良い代替手段でしょJava
うか?はいの場合、なぜですか?
2 に答える
GetPrimitiveArrayCritical
JNIは、GetStringCritical
以下を使用する場合を除いて、さまざまな方法で実行できることを制限しません。
を呼び出した後
GetPrimitiveArrayCritical
、ネイティブコードは、を呼び出す前に長時間実行しないでくださいReleasePrimitiveArrayCritical
。この関数のペア内のコードは、「クリティカル領域」で実行されているものとして扱う必要があります。クリティカル領域内では、ネイティブコードは、他のJNI関数、または現在のスレッドをブロックして別のJavaスレッドを待機させる可能性のあるシステムコールを呼び出さないようにする必要があります。(たとえば、現在のスレッドは、別のJavaスレッドによって書き込まれているストリームでreadを呼び出さないでください。)
それ以外の場合は、JVMとOSの相互作用を変更すること( JVMシグナルハンドラーの置き換えなど)を禁止して、好きなことを自由に行うことができます。
また、ネイティブ関数を直接呼び出すのではなく、スクリプトを実行する必要があるかどうかを尋ねます。C ++ライブラリが何をするのか正確にわからない場合は、外部プロセスを実行する方が安全ですが、同じプロセスで呼び出しを行うよりも便利ではなく(通信方法を確立する必要があります)、おそらく低速です。