Javaアプリケーションが独自のプロセス間メッセージ受け渡し環境とのインターフェイスをとれるようにAPIを設計しようとしています。メッセージは、非管理メモリにあらかじめ存在します。メッセージを受け取ったら、メッセージを読み書きするストリームが必要です。私はJNIの基本を理解していますが、アンマネージメモリへのストリームを作成するのに役立つ標準Javaクラスを理解することは苦労しています。Java管理されていないメモリストリーム
私は直接のByteBufferを使用します
よろしく
Javaアプリケーションが独自のプロセス間メッセージ受け渡し環境とのインターフェイスをとれるようにAPIを設計しようとしています。メッセージは、非管理メモリにあらかじめ存在します。メッセージを受け取ったら、メッセージを読み書きするストリームが必要です。私はJNIの基本を理解していますが、アンマネージメモリへのストリームを作成するのに役立つ標準Javaクラスを理解することは苦労しています。Java管理されていないメモリストリーム
私は直接のByteBufferを使用します
よろしく
任意のポインタに感謝することでしょう。 JNIを使用してアドレスと制限を変更することができます。これが実行されると、このByteBuffer内の何かを読んだり変更したりすることができ、それは「管理されていない」サイズで変更されます。
ByteBufferは、すべてのプリミティブ型のリトルビッグエンディアンとビッグエンディアンの読み取りと書き込みをサポートします。
これを実行する生の方法は、安全でないクラスを使用することです。これは、メモリのランダムな領域(ちょうどポインタのようなもの)でプリミティブにアクセスすることをサポートします。これは、多くの場合、単一のマシンコード命令にもなります。安全でないか安全でないか、ByteBufferを使うことができれば、より良い選択です。
これは肯定的なものです。私が参照できる使用例がありますか? –
いいえ、私は前にその方法で使っています。 ByteBufferはGCedで解放された元のアドレスを持つCleanerオブジェクトを持っているため、上書きするアドレスはメモリリークを引き起こします。 –
JavaでByteBufferを作成し、Cでアドレスを変更することをお勧めしますか? 'NewDirectByteBuffer' JNI呼び出しに遭遇しましたか? –
JNIのAPIをとして宣言されているNewDirectByteBufferと呼ばれる方法があります:何それがないことは、それの上部と長さを指すvoid*
で説明したメモリ領域を、取るである
jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
、および作成それを包むByteBuffer。これはコピーではありません。バッファを変更するとメモリ領域のデータが変更されます。
ByteBufferにはかなり豊富なAPIがあります。読み込み元のInputStreamまたは書き込み先のOutputStreamを作成する標準的な方法はありませんが、書き込みは非常に簡単です。
ポインタ...あなたはそれを手に入れますか? –