2016-07-11 15 views
10

Vấn đề bình thường trong Java là bạn phải to hack để có được một unmapping thích hợp của bộ nhớ ánh xạ file - xem here cho báo cáo lỗi cũ 14year;)Unmapping hoặc 'phát hành' một MappedByteBuffer dưới Android

Nhưng trên Android có có vẻ là 0 giải pháp trong Java thuần túy và chỉ thông qua NDK. Điều này có đúng không? Nếu có, bất kỳ gợi ý nào đến một giải pháp nguồn mở với các ràng buộc Android/Java?

+0

Dưới đây là lý do của câu hỏi này: http: //stackoverflow.com/questions/38293892/java-mmap-fails-on-android-with-mmap-failed-enomem-out-of-memory – Karussell

Trả lời

0

Từ trang web Android Developers:

Một byte đệm trực tiếp mà nội dung là một vùng bộ nhớ ánh xạ của một tập tin.

Bộ đệm byte được ánh xạ được tạo thông qua phương thức FileChannel.map. Lớp này mở rộng lớp ByteBuffer với các hoạt động cụ thể cho các vùng tệp được ánh xạ trên bộ nhớ.

Bộ đệm byte được ánh xạ và ánh xạ tệp mà nó thể hiện vẫn hợp lệ cho đến khi chính vùng đệm được thu thập rác.

Nội dung của bộ đệm byte được ánh xạ có thể thay đổi bất kỳ lúc nào, ví dụ: nếu nội dung của vùng tương ứng của tệp được ánh xạ bị thay đổi bởi chương trình này hoặc chương trình khác. Có hay không những thay đổi như vậy xảy ra, và khi chúng xảy ra, là hệ điều hành phụ thuộc và do đó không xác định.

Đối với những gì tôi đã hiểu từ văn bản này, là không có cách nào để hủy ánh xạ MappedByteBuffer bằng cách sử dụng SDK Java của Android. Chỉ sử dụng NDK, như bạn đã nói.

+0

Không có cách nào chính thức, vâng. Nhưng có một cách 'không chính thức' như trên máy tính để bàn không? Và nếu không, bạn có biết một số lib nguồn mở cho giải pháp NDK không? – Karussell

+0

Tôi sẽ kiểm tra và tôi sẽ cho bạn biết –

+0

Tôi đã kiểm tra và không tìm thấy gì ... –

1

Không có bản hack nào khả dụng trong Android.

Nhưng có một vài người giúp đỡ và đoạn mà làm cho C-Java bắt buộc đối với các file mmap dễ dàng/dễ dàng hơn:

Xem util-mmap trong hành động, thực sự dễ dàng:

public class MMapTesting { 

    public static void main(String[] args) throws IOException { 
     File file = new File("test"); 
     MMapBuffer buffer = new MMapBuffer(file, 0, 1000, FileChannel.MapMode.READ_WRITE, ByteOrder.BIG_ENDIAN)) { 
      buffer.memory().intArray(0, 100).set(2, 234); 
     // calls unmap under the hood 
     buffer.close(); 

     // here we call unmap automatically at the end of this try-resource block 
     try (MMapBuffer buffer = new MMapBuffer(file, FileChannel.MapMode.READ_WRITE, ByteOrder.BIG_ENDIAN)) { 
      System.out.println("length: " + buffer.memory().length()); 
      IntArray arr = buffer.memory().intArray(0, buffer.memory().length()/8); 
      // prints 234 
      System.out.println(arr.get(2)); 
     } 
    } 
} 
+0

Tại sao các downvote (s)? – Karussell

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