0

JNI 呼び出しからしてはいけないことはありますか? これは何?
たとえば、内部でブロッキングおよび非ブロッキング I/O 呼び出しを行う C++ ライブラリを使用する必要があります。
これらの場合に注意すべき注意事項はありますか? また、同じ機能がスクリプトによって提供されることも知っています (ただし、実際のスクリプト言語はわかりません)。それは(からスクリプトを呼び出すための)より良い代替手段でしょJavaうか?はいの場合、なぜですか?

4

2 に答える 2

1

GetPrimitiveArrayCriticalJNIは、GetStringCritical以下を使用する場合を除いて、さまざまな方法で実行できることを制限しません。

を呼び出した後GetPrimitiveArrayCritical、ネイティブコードは、を呼び出す前に長時間実行しないでください ReleasePrimitiveArrayCritical。この関数のペア内のコードは、「クリティカル領域」で実行されているものとして扱う必要があります。クリティカル領域内では、ネイティブコードは、他のJNI関数、または現在のスレッドをブロックして別のJavaスレッドを待機させる可能性のあるシステムコールを呼び出さないようにする必要があります。(たとえば、現在のスレッドは、別のJavaスレッドによって書き込まれているストリームでreadを呼び出さないでください。)

それ以外の場合は、JVMとOSの相互作用を変更すること( JVMシグナルハンドラーの置き換えなど)を禁止して、好きなことを自由に行うことができます。

また、ネイティブ関数を直接呼び出すのではなく、スクリプトを実行する必要があるかどうかを尋ねます。C ++ライブラリが何をするのか正確にわからない場合は、外部プロセスを実行する方が安全ですが、同じプロセスで呼び出しを行うよりも便利ではなく(通信方法を確立する必要があります)、おそらく低速です。

于 2012-12-12T00:41:37.993 に答える