2016-07-11 5 views
10

Обычная проблемой в Java является то, что у вас есть to hack, чтобы получить надлежащую unmapping из памяти отображенных файлов - см here для 14year старого отчета об ошибке;)Unmapping или «релиз» а MappedByteBuffer под Android

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

+0

Вот причина этого вопроса: HTTP: //stackoverflow.com/questions/38293892/java-mmap-fails-on-android-with-mmap-failed-enomem-out-of-memory – Karussell

ответ

0

С Android Developers сайта:

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

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

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

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

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

+0

Нет официального пути, да. Но есть ли «неофициальный» способ, как на рабочем столе? И если нет, знаете ли вы какую-то библиотеку с открытым исходным кодом для решения NDK? – Karussell

+0

Я проверю, и я дам вам знать –

+0

Я проверил и ничего не нашел ... –

1

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

Но есть несколько помощников и фрагменты, которые делают 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)); 
     } 
    } 
} 
+0

Почему нисходящие (ы)? – Karussell

Смежные вопросы