2011-11-17 28 views
12

Chcę napisać kilka bajtów do pamięci współdzielonej. Odbywa się to w mojej aplikacji1. Z mojej innej aplikacji: application2 chcę uzyskać dostęp do pamięci współdzielonej, aby odczytać zapisane bajty. W tym celu próbowałem używać klasy MemoryFile Android. Utknąłem, jak odnieść się do tej samej pamięci fragmentarycznej między dwiema różnymi aplikacjami. Jestem również teraz zdezorientowany, jeśli memoryFile jest używany do tego samego celu, czy nie. http://developer.android.com/reference/android/os/MemoryFile.html ten link znalazłem w odniesieniu do tematu. Z góry dzięki. Krishnajaki jest pożytek z MemoryFile w Androidzie

+2

Myślę, że „oficjalne” droga jest użycie dostawca treści lub użyć zwykłego pliku na pamięci zewnętrznej. –

+1

+1 dla ContentProvider/ContentResolver – Guillaume

+0

Rozmiar treści jest duży (3-4 MB) i potrzebuję szybkiego odczytu, więc potrzebuję czegoś takiego jak pamięć współdzielona. Proszę również, jeśli mógłbyś mi pomóc zrozumieć użycie pliku pamięci w systemie Android. –

Odpowiedz

12

Jeśli chcesz niektóre wykorzystanie cross-proces z MemoryFile można użyć następujących fugly metoda:

import android.os.MemoryFile; 
import android.os.ParcelFileDescriptor; 

import java.io.FileDescriptor; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class MemoryFileUtil { 
    private static final Method sMethodGetParcelFileDescriptor; 
    private static final Method sMethodGetFileDescriptor; 
    static { 
     sMethodGetParcelFileDescriptor = get("getParcelFileDescriptor"); 
     sMethodGetFileDescriptor = get("getFileDescriptor"); 
    } 

    public static ParcelFileDescriptor getParcelFileDescriptor(MemoryFile file) { 
     try { 
      return (ParcelFileDescriptor) sMethodGetParcelFileDescriptor.invoke(file); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } catch (InvocationTargetException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public static FileDescriptor getFileDescriptor(MemoryFile file) { 
     try { 
      return (FileDescriptor) sMethodGetFileDescriptor.invoke(file); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } catch (InvocationTargetException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private static Method get(String name) { 
     try { 
      return MemoryFile.class.getDeclaredMethod(name); 
     } catch (NoSuchMethodException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

Co powinno być patrząc na to metoda #getParcelFileDescriptor(MemoryFile) którego można wrócić z realizacji z ContentProvider#openFile(Uri, String).

+1

Podejrzewam, że mój kod zgłasza wyjątek w MemoryFile.class.getDeclaredMethod ("getParcelFileDescriptor"); ale nie robi tak naprawdę klauzuli catcho, którą znałem dopiero po umieszczeniu punktu przerwania. –

+0

Naprawdę nie rozumiem. Jeśli wszystko, co robisz, przechodzi przez FD, dlaczego w ogóle używasz asmemu? Możesz po prostu użyć ParcelFileDescriptor.createPipe() i napisać dowolne dane lokalne, które chcesz. Nie jest wymagany żaden asmem. –

3

Podejrzewam, że pliki pamięci nie mają metody getParcelFileDescriptor. Kiedy skomentowałem tę metodę getParcelFileDescriptor i używam getFileDescriptor. To działało ładnie.

import java.io.FileDescriptor; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import android.os.MemoryFile; 

/** 
* Invoke hidden methods using reflection 
* 
*/ 
public class MemoryFileUtil { 
    private static final Method sMethodGetFileDescriptor; 
    static { 
     sMethodGetFileDescriptor = get("getFileDescriptor"); 
    } 

    public static FileDescriptor getFileDescriptor(MemoryFile file) { 
     try { 
      return (FileDescriptor) sMethodGetFileDescriptor.invoke(file); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } catch (InvocationTargetException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private static Method get(String name) { 
     try { 
      return MemoryFile.class.getDeclaredMethod(name); 
     } catch (NoSuchMethodException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

Utworzony deskryptor pliku z pliku pamięci.

FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile); 
0

Plik pamięciowy może być używany do mapowania do pamięci fizycznej. Deskryptor pliku wyników (fd) można przekazać do klienta (strona współdzielenia pamięci). Klient może odwzorować ten sam macierzysty fd na ten sam obszar pamięci. Pamięć można następnie udostępnić przy użyciu natywnego fd, który można odwzorować na warstwę Java za pomocą metody InputStream.

Proszę odnieść się do tego linku więcej szczegółów:
Sharing memory using ashem.

Powiązane problemy