Unmapping или 'release' MappedByteBuffer под Android

Обычная проблема на Java заключается в том, что у вас есть для взлома, чтобы получить правильное разбиение файлов с отображением памяти - см. здесь для 14-летнего отчета об ошибке;)

Но на Android, похоже, 0 решений в чистой Java и только через NDK. Это правда? Если да, то какие-либо указатели на решение с открытым исходным кодом с привязками к Android/Java?

Ответ 1

В Android нет взлома.

Но есть несколько помощников и фрагментов, которые упрощают/упрощают привязку C-Java для файлов 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));
        }
    }
}

Ответ 2

От веб-сайт разработчиков Android:

Прямой байтовый буфер, содержимое которого является областью памяти, отображаемой в файле.

Буферы с байт-байтами создаются с помощью метода FileChannel.map. Этот класс расширяет класс ByteBuffer с помощью операций, специфичных для областей файлов с отображением памяти.

Отображаемый байт-буфер и сопоставление файлов, которое он представляет, остаются в силе до тех пор, пока сам буфер не будет собран с помощью мусора.

Содержимое отображаемого байтового буфера может измениться в любое время, например, если содержимое соответствующей области измененного файла будет изменено этой программой или другой. Независимо от того, происходят или нет такие изменения, и когда они происходят, зависит от операционной системы и поэтому не указывается.

Что касается того, что я понял из этого текста, заключается в том, что нельзя отключить MappedByteBuffer с помощью Android Java SDK. Только используя NDK, как вы сказали.