2016-07-11 27 views
10

Zazwyczaj problemem w Javie jest to, że masz to hack aby uzyskać właściwe usuwanie mapowań pamięci mapowane plików - patrz here dla 14year starym raportu o błędzie;)usuwanie mapowań lub „uwolnienie” a MappedByteBuffer pod Androida

Ale tam Androida wydaje się być 0 rozwiązaniami w czystej Java i tylko przez NDK. Czy to prawda? Jeśli tak, jakieś wskazówki do rozwiązania open source z powiązaniami Android/Java?

+0

Oto przyczyna tego pytania: http: //stackoverflow.com/questions/38293892/java-mmap-fails-on-android-with-mmap-failed-enomem-out-of-memory – Karussell

Odpowiedz

0

Od strony Android Developers:

Bezpośrednim bufor bajt, którego zawartość jest regionem pamięci mapowane pliku.

Zmapowane bufory bajtów tworzone są za pomocą metody FileChannel.map. Ta klasa rozszerza klasę ByteBuffer o operacje specyficzne dla regionów plików mapowanych w pamięci.

Zmapowany bufor bajtowy i odwzorowanie pliku, które reprezentuje, pozostają ważne, dopóki sam bufor nie zostanie usunięty.

Zawartość zmapowanego bufora bajtowego może się zmienić w dowolnym momencie, na przykład, jeśli zawartość odpowiedniego regionu zmapowanego pliku zostanie zmieniona przez ten lub inny program. To, czy takie zmiany wystąpią, i kiedy się pojawią, jest zależne od systemu operacyjnego, a zatem nieokreślone.

Jeśli chodzi o to, co zrozumiałem z tego tekstu, jest to, że nie ma sposobu, aby odłączyć MappedByteBuffer przy użyciu zestawu SDK Java dla Androida. Korzystasz tylko z NDK, jak powiedziałeś.

+0

Nie ma oficjalnej metody, tak. Ale czy istnieje "nieoficjalny" sposób na komputerze? A jeśli nie, czy znasz jakieś biblioteki open source do rozwiązania NDK? – Karussell

+0

Sprawdzę, a dam ci znać –

+0

Sprawdziłem i nic nie znalazłem ... –

1

Nie ma hackowania pod Androidem.

Ale istnieje kilka pomocników i fragmenty, które sprawiają, wiązanie C-Java dla mmap plików łatwy/łatwiejsze:

Patrz util-mmap w działaniu, bardzo proste:

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

Dlaczego spadki? – Karussell