【问题标题】:Unmapping or 'release' a MappedByteBuffer under Android在 Android 下取消映射或“释放”一个 MappedByteBuffer
【发布时间】:2016-11-13 21:26:37
【问题描述】:

Java 中的常见问题是您有 to hack 才能正确取消映射内存映射文件 - 请参阅 here 了解 14 年前的错误报告;)

但在 Android 上,纯 Java 和仅通过 NDK 似乎有 0 个解决方案。这是真的?如果是,任何指向带有 Android/Java 绑定的开源解决方案的指针?

【问题讨论】:

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


【解决方案1】:

Android 下没有 hack。

但是有一些帮助程序和 sn-ps 使 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));
        }
    }
}

【讨论】:

    【解决方案2】:

    来自Android Developers 网站:

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

    映射字节缓冲区是通过 FileChannel.map 方法创建的。此类扩展了 ByteBuffer 类,其中包含特定于内存映射文件区域的操作。

    一个映射的字节缓冲区和它所代表的文件映射在缓冲区本身被垃圾回收之前保持有效。

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

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

    【讨论】:

    • 官方没有办法,是的。但是有没有像桌面一样的“非官方”方式?如果没有,你知道一些用于 NDK 解决方案的开源库吗?
    • 我会检查并告诉你
    猜你喜欢
    • 2012-07-04
    • 2012-03-04
    • 2019-09-20
    • 1970-01-01
    • 2014-12-28
    • 2013-06-19
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多