11

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?

Karussell
  • 17,085
  • 16
  • 97
  • 197
  • Here is the reason of this question: http://stackoverflow.com/questions/38293892/java-mmap-fails-on-android-with-mmap-failed-enomem-out-of-memory – Karussell Jul 25 '16 at 11:01

2 Answers2

1

There is no hack available under Android.

But there are a few helpers and snippets which make the C-Java binding for mmap files easy/easier:

See the util-mmap in action, really easy:

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));
        }
    }
}
Karussell
  • 17,085
  • 16
  • 97
  • 197
0

From the Android Developers website:

A direct byte buffer whose content is a memory-mapped region of a file.

Mapped byte buffers are created via the FileChannel.map method. This class extends the ByteBuffer class with operations that are specific to memory-mapped file regions.

A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself is garbage-collected.

The content of a mapped byte buffer can change at any time, for example if the content of the corresponding region of the mapped file is changed by this program or another. Whether or not such changes occur, and when they occur, is operating-system dependent and therefore unspecified.

As for what I've understood from this text, is that there is no way to unmap the MappedByteBuffer using the Android Java SDK. Only using the NDK, like you said.

Community
  • 1
  • 1
Ido Naveh
  • 2,442
  • 3
  • 26
  • 57