2013-05-09 21 views
6

Hoặc tôi có phải có chức năng trợ giúp JNI để gọi env-> NewDirectByteBuffer (bộ đệm, kích thước) không?Có cách nào để tạo một ByteBuffer trực tiếp từ một con trỏ duy nhất trong Java không?

+1

Bạn đã nhìn sun.misc.unsafe? Nó cho phép bạn tương tác trực tiếp với bộ nhớ. – assylias

+0

Tôi đã xem xét và không thấy cách tạo bộ đệm byte trực tiếp với sun.misc.unsafe. Tôi đã tìm thấy một cách để tạo ra một DirectByteBuffer và nó thông qua sự phản ánh. Sử dụng java.lang.Class.getDeclaredConstructor để tạo một đối tượng Constructor, setAccessable thành true và gọi newInstance với các tham số thích hợp. Ít đùa nhưng bạn không phải viết bất kỳ mã JNI nào. –

Trả lời

15

Điều tôi làm là tạo DirectByteBuffer bình thường và thay đổi địa chỉ của nó.

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); 

Từ thời điểm này, bạn có thể truy cập ByteBuffer tham chiếu đến địa chỉ cơ bản. Tôi đã làm điều này để truy cập bộ nhớ trên bộ điều hợp mạng để không sao chép và nó hoạt động tốt.

Bạn có thể tạo DirectByteBuffer cho địa chỉ của mình trực tiếp nhưng điều này ít rõ ràng hơn.


Một cách khác là sử dụng không an toàn (chỉ hoạt động trên OpenJDK/HotSpot JVM và trong thứ tự byte mẹ đẻ)

Unsafe.getByte(address); 
Unsafe.getShort(address); 
Unsafe.getInt(address); 
Unsafe.getLong(address); 
+0

Câu trả lời tuyệt vời, tuy nhiên tôi đã phải hack vào nó một số để làm cho nó hoạt động, cụ thể là địa chỉ Field = Buffer.class.getDeclaredField ("address"). – Erik

+0

@Erik cảm ơn bạn đã sửa. –

+0

Vì vậy, đây là một theo dõi cho câu hỏi ban đầu vì bạn vẫn chú ý. Cách tốt nhất để làm sạch bộ nhớ gắn liền với ByteBuffer theo cách này là gì? Liệu ByteBuffer có hoàn thành địa chỉ miễn phí hay người gọi nên can thiệp và dọn dẹp phân bổ không? Với mục đích của câu hỏi này, giả sử tôi đã viết một thư viện JNI với các trình bao bọc xung quanh malloc và miễn phí :) Có lẽ xứng đáng là câu hỏi của chính nó bây giờ mà tôi đã nghĩ về nó nhiều hơn. – Erik

Các vấn đề liên quan