在Android下取消映射或“释放”MappedByteBuffer

在Java中的常见问题是,你必须破解得到一个适当的内存映射文件的映射 – 参见这里的14年的旧bug报告;)

但在Android上,似乎只有通过NDK的纯Java解决scheme。 这是真的? 如果是的话,指向Android / Java绑定的开源解决scheme?

    Android下没有黑客。

    但是有一些帮助和片段可以使C-Java绑定mmap文件变得简单/容易:

    • util-mmap ,Apache License 2.0, 这里是关于Android支持的一个问题
    • 使用内存映射文件和JNI在Java和C ++程序之间进行通信或使用像javacpp这样的工具更容易?
    • 它看起来像tomcat实现了一个帮助(jni.MMap) ,能够取消映射/删除一个mmap文件

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

    从Android开发者网站:

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

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

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

    映射字节缓冲区的内容可以随时改变,例如,如果映射文件的相应区域的内容被这个程序改变或者另一个改变了。 无论这种变化是否发生,以及何时发生,都取决于操作系统,因此没有具体说明。

    至于我从这段文字中了解的内容,是没有办法使用Android Java SDK去映射MappedByteBuffer 。 就像你说的那样只使用NDK。