Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unmapping or 'release' a MappedByteBuffer under Android

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?

like image 350
Karussell Avatar asked Jul 11 '16 20:07

Karussell


1 Answers

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:

  • util-mmap, Apache License 2.0, here is an issue regarding Android support
  • Using Memory Mapped Files and JNI to communicate between Java and C++ programs or easier with tools like javacpp?
  • It looks tomcat has implement a helper (jni.MMap) that is able to unmap/delete a mmap file

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));
        }
    }
}
like image 123
Karussell Avatar answered Nov 14 '22 03:11

Karussell