2011-10-25 16 views
4

私は質問がありますが、これは可能ですか? JavaでC/C++から作成されたメモリ内のバッファからバイトを読み込む?私の考えは、バッファにバイトを書き込み、バッファの方向をJavaに送信するC++のサイクルを開始するためにJNIを使​​用することです。その後、Javaは別のサイクルでそのバイトを読み取ります。目標は、JNI関数の呼び出しを減らすことです。なぜなら、それらがパフォーマンスを低下させることに気付いたからです。私はJavaでどのクラスを使用しなければならないのか、またどのような機能をC++で使用するのかを知りたい。事前にC/C++からメモリにバッファを書き込み、JNIなしでJavaでバッファを読み込みます。

答えて

3

あなたがたByteBufferを使用することができますどうもありがとうございました。最も簡単な方法は、Javaによって割り当てられたアドレスを使用してByteBuffer.allocateDirect()を使用することです。 Cで提供されているアドレスを使用する必要がある場合は、アドレスを変更してサイズを制限して、好きな場所を指すようにすることができます。

低レベルのものを使用する場合は、Oracle JVMでUnsafe.getXxxx(long address)またはUnsafe.setXxxx(long address, T value)メソッドを使用できますが、誤った使用によってJVMがクラッシュする可能性があるため、注意して使用する必要があります。 (ちょうどCで無効なポインタを使うのと同じように)これらのメソッドはByteBufferによって使用され、最適化された単一のマシンコード命令に変換されます。

+0

私はメモリ内のアドレスを割り当てるためにjavaを使用することができ、そのバッファに書き込むためにCで使用できますか?お返事ありがとうございました –

+0

できます。これが最も安全なアプローチです。 ByteBuffer.order(ByteOrder.NativeOrder()) 'を使用すると、どのプラットフォームでも正しくなります。デフォルトではビッグエンディアンであるため、バイトオーダーを設定することができます(x86/x64ではC言語のリトルエンディアンです)。 –

+1

おかげでそれを行う正しい方法です。 –

関連する問題