2016-07-11 76 views
10

Il solito problema in Java è che si deve to hack per ottenere una corretta unmapping di file mappati memoria - vedi here per il rapporto 14 anni bug vecchio;)Unmapping o 'rilascio' un MappedByteBuffer sotto Android

Ma su Android c'è sembra essere 0 soluzioni in puro Java e solo tramite NDK. È vero? Se sì, qualche suggerimento su una soluzione open source con binding Android/Java?

+0

Ecco la ragione di questa domanda: http: //stackoverflow.com/questions/38293892/java-mmap-fails-on-android-with-mmap-failed-enomem-out-of-memory – Karussell

risposta

0

Dal sito Android Developers:

Un buffer di byte diretta il cui contenuto è una regione mappato in memoria di un file.

I buffer di byte mappati vengono creati tramite il metodo FileChannel.map. Questa classe estende la classe ByteBuffer con operazioni specifiche per aree di file mappate in memoria.

Un buffer di byte mappato e il mapping di file che rappresenta rimangono validi finché il buffer stesso non viene raccolto.

Il contenuto di un buffer di byte mappato può cambiare in qualsiasi momento, ad esempio se il contenuto della regione corrispondente del file mappato viene modificato da questo programma o da un altro. Se tali cambiamenti si verificano e quando si verificano, dipende dal sistema operativo e quindi non specificato.

Per quanto riguarda quello che ho capito da questo testo, è che non v'è alcun modo per eliminare la mappatura dei MappedByteBuffer utilizzando la Java SDK di Android. Solo usando NDK, come hai detto tu.

+0

Non esiste un modo ufficiale, sì. Ma c'è un modo "non ufficiale" come su desktop? E se no, conosci qualche lib di open source per la soluzione NDK? – Karussell

+0

Controllerò e ti farò sapere –

+0

Ho controllato e non ho trovato nulla ... –

1

Non c'è nessun trucco disponibile su Android.

Ma ci sono un paio di aiutanti e frammenti che rendono vincolante il C-Java per i file facile mmap/facile:

Vedere la util-mmap in azione, davvero facile:

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

Perché il downvote (s)? – Karussell