または、env-> NewDirectByteBuffer(buffer、size)を呼び出すJNIヘルパ関数が必要ですか?ポインタだけからJavaで直接ByteBufferを作成する方法はありますか?
答えて
通常のDirectByteBufferを作成してそのアドレスを変更します。
Field address = Buffer.class.getDeclaredField("address");
address.setAccessible(true);
Field capacity = Buffer.class.getDeclaredField("capacity");
capacity.setAccessible(true);
ByteBuffer bb = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
address.setLong(bb, addressYouWantToSet);
capacity.setInt(bb, theSizeOf);
この時点から、基になるアドレスを参照するByteBufferにアクセスできます。私はゼロコピーのためのネットワークアダプタ上のメモリにアクセスするためにこれを行い、それは正常に働いた。
直接アドレス用のDirectByteBufferを作成することはできますが、これはあいまいです。
代替は安全でないを使用することです(OpenJDKの/ホットスポットのJVM上のネイティブのバイト順でのみ動作)
Unsafe.getByte(address);
Unsafe.getShort(address);
Unsafe.getInt(address);
Unsafe.getLong(address);
偉大な答え、しかし、私はそれを動作させるためにいくつかの、特にフィールドアドレス= Buffer.class.getDeclaredField( "アドレス")ハックしなければならなかった。 – Erik
@エリック訂正ありがとうございます。 –
あなたがまだ注意を払っているので、ここに元の質問へのフォローアップがあります。この方法でByteBufferに接続されたメモリをクリーンアップする最善の方法は何ですか? ByteBufferは空きアドレスを確定しますか、または発信者が割り込んで割り振りをクリーンアップする必要がありますか?この質問の目的のために、私はmallocの周りにラッパーを入れたJNIライブラリを書いたと仮定します:)おそらく私はもっとそれについて考えていたので、それはおそらくそれ自身の問題です。 – Erik
- 1. ByteBufferから残りのバイト(Java NIO)を1バイトだけ取得する方法
- 2. JNIからJava ByteBufferのポインタを取得
- 3. Tensorflowでは、スカラーテンソルから配列テンソルを直接作成する方法はありますか?
- 4. Logstash:CSVファイルのヘッダから直接フィールドを作成する方法はありますか?
- 5. BashコマンドからS3ファイルオブジェクトに直接リダイレクトする方法はありますか?
- 6. 直接データベースリクエスト(DDR)フィルタクエリ内で変数を作成または設定する方法はありますか?
- 7. XNA:タイルセットから直接タイルを引き出す方法はありますか?
- 8. javascriptで生成されたコンテンツをWebページから直接取得する方法はありますか?
- 9. ByteBufferからStringに直接移動しますが、中間バイト[]はありません。
- 10. SwiftにUIImageを作成してアニメーションを1回だけ作成する方法はありますか?
- 11. 直接のByteBufferをネイティブに書き込む/読む方法は?
- 12. JDBC SQLドライバ接続(JAVA)の作成時に接続タイムアウトを設定する方法はありますか?
- 13. 別のセットアップを作成せずにmsmを直接インストールする方法はありますか?
- 14. C#Roslynを使用してメソッドノードを直接作成する方法はありますか?
- 15. EJBに片方向接続を作成する方法はありますか?
- 16. Androidデバイスでテストスクリプトを直接実行する方法はありますか?
- 17. Androidで直接htmlをデコードする良い方法はありますか?
- 18. ActiveRecord接続からサーバを見つける方法はありますか?
- 19. メインリソースフォルダから直接JARファイルを使用する方法Java
- 20. Javaでグローバル変数を作成する方法はありますか?
- 21. Derby DBでJava Appのインストーラを作成する方法はありますか
- 22. eclipseでJavaプロジェクトのコピーを作成する方法はありますか?
- 23. Javaでオブジェクトを作成する方法はいくつありますか?
- 24. XCode 8から直接.xcarchiveを作成することはできますか?
- 25. このJava ByteBufferの動作についての説明はありますか?
- 26. iOS向けのPDFでレポートを作成する方法はありますか?
- 27. アクションスクリプトはファイルをメモリに直接アップロードする方法はありますか?
- 28. Pythonで直接ハードウェアにアクセスする方法はありますか?
- 29. Angularjsで直接コントローラとスコープと対話する方法はありますか?
- 30. ByteBufferをIntegerとStringに変換する方法はありますか?
はあなたがsun.misc.unsafeで見たことがありますか?それはあなたが直接メモリと対話することができます。 – assylias
私はsun.misc.unsafeでダイレクトバイトバッファを作成する方法を見ていませんでした。私はDirectByteBufferを作成する方法を見つけましたが、それは反映されています。 java.lang.Class.getDeclaredConstructorを使用してConstructorオブジェクトを作成し、setAccessableをtrueに設定し、適切なパラメータを指定してnewInstanceを呼び出します。リトルジャンクですが、JNIコードを書く必要はありません。 –