Unmapping or 'release' a MappedByteBuffer under Android

时间:2016-07-11 20:05:06

标签: java android memory-management android-ndk mmap

The usual problem in Java is that you have to hack to get a proper unmapping of memory mapped files - see here for the 14year old bug report ;)

But on Android there seems to be 0 solutions in pure Java and just via NDK. Is this true? If yes, any pointers to an open source solution with Android/Java bindings?

2 个答案:

答案 0 :(得分:1)

Android下没有黑客可用。

但是有一些助手和片段使得mmap文件的C-Java绑定变得容易/容易:

查看util-mmap的实际操作,非常简单:

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

答案 1 :(得分:0)

来自Android Developers网站:

  

直接字节缓冲区,其内容是文件的内存映射区域。

     

通过FileChannel.map方法创建映射的字节缓冲区。此类使用特定于内存映射文件区域的操作扩展ByteBuffer类。

     

映射的字节缓冲区及其表示的文件映射在缓冲区本身被垃圾收集之前保持有效。

     

映射字节缓冲区的内容可以随时更改,例如,如果此程序或其他程序更改了映射文件的相应区域的内容。这些变化是否发生以及何时发生,都取决于操作系统,因此未指定。

至于我从本文中了解到的是,没有办法使用Android Java SDK取消映射MappedByteBuffer。只使用NDK,就像你说的那样。