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?
Trả lời
Đ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);
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
@Erik cảm ơn bạn đã sửa. –
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
- 1. Lấy con trỏ của một ByteBuffer Java mặc dù JNI
- 2. Có thể xem nhiều chuỗi ghi trên một ByteBuffer được ánh xạ trực tiếp trong Java không?
- 3. Sử dụng sun.misc.Unsafe, cách nhanh nhất để quét byte từ ByteBuffer trực tiếp là gì?
- 4. So sánh trực tiếp và không trực tiếp ByteBuffer có được/đặt hoạt động
- 5. Xóa nhanh (không rõ) một ByteBuffer trong Java
- 6. Cách tốt nhất để xóa một std :: unique_ptr từ một vector với một con trỏ thô?
- 7. chuyển byte từ một ByteBuffer sang một ByteBuffer khác
- 8. Làm cách nào để tạo một mảng con trỏ?
- 9. cách đúc một con trỏ gián tiếp trong Objective-C
- 10. Tạo con trỏ để trỏ đến một mảng
- 11. Tạo một dấu thời gian duy nhất trong Java
- 12. Gọi một dịch vụ RPC GWT từ Java trực tiếp
- 13. Làm thế nào để truyền tải video trực tiếp từ bên trong một ứng dụng Java?
- 14. Làm cách nào để sắp xếp một con trỏ tới một con trỏ tới một int?
- 15. Có thể BitBlt trực tiếp từ bitmap GDI + không?
- 16. Khởi tạo một con trỏ
- 17. Tạo tên duy nhất có sẵn tiếp theo trong C#
- 18. Có cách nào để tạo một hình ảnh Gif từ nhiều hình ảnh trong Java không?
- 19. HorizontalScrollView có thể lưu trữ chỉ một con trực tiếp
- 20. Hợp nhất dữ liệu trong một bảng SQL đơn lẻ mà không có một con trỏ
- 21. Tạo một ID duy nhất trong PHP
- 22. Tạo một bảng từ cột CSV trong SQL Server mà không sử dụng một con trỏ
- 23. Điền các widget từ một con trỏ trong onLoadFinished()
- 24. Cassandra: Tạo một ID duy nhất?
- 25. con trỏ "này" bên trong một lớp
- 26. Làm cách nào để tạo một JAR từ .java
- 27. Làm cách nào để tạo ID duy nhất thân thiện với con người bằng Python?
- 28. Làm thế nào để tạo một con trỏ trỏ tới bất kỳ phần tử mảng nào của một mảng 2D?
- 29. Làm cách nào để tạo id duy nhất trong MySQL?
- 30. Bộ nhớ ánh xạ MappedByteBuffer hoặc ByteBuffer trực tiếp để thực hiện DB?
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
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. –