2011-11-17 88 views
12

我想一些字節寫入共享內存使用MemoryFile的。這是在我的應用程序1中完成的。從我的另一個應用程序:application2我想訪問該共享內存來讀取寫入的字節。爲此,我嘗試使用android的MemoryFile類。我被困在如何在兩個不同的應用程序之間引用相同的碎片內存。如果memoryFile用於相同的目的,我現在也感到困惑。 http://developer.android.com/reference/android/os/MemoryFile.html這個環節,我發現關於該主題的。 在此先感謝。 克里希納什麼是Android

+2

我認爲「官方」的方式去是使用內容提供商,或使用外部存儲的常規文件。 –

+1

+1的ContentProvider/ContentResolver的 – Guillaume

+0

內容的尺寸較大(3-4 MB),我需要快速讀寫,所以我需要這樣的東西共享內存。如果您可以幫助我瞭解Android中的memoryFile的使用,請另行。 –

回答

12

如果你想要一些與MemoryFile跨進程使用,你可以使用下面的的fugly方法:

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); 
     } 
    } 
} 

什麼,你應該看的是#getParcelFileDescriptor(MemoryFile)方法,你可以從一個實現返回的ContentProvider#openFile(Uri, String)

+1

我懷疑我的代碼在MemoryFile.class.getDeclaredMethod(「getParcelFileDescriptor」)拋出異常;但它並沒有真正轉到catch條款我知道只有在放置斷點後 –

+0

我真的不明白它。如果你所做的只是通過FD,爲什麼要使用ashmem呢?你可以只用ParcelFileDescriptor.createPipe()和寫你想跨越任何本地數據。不需要灰塵。 –

3

我懷疑內存中的文件沒有getParcelFileDescriptor方法。當我評論這個getParcelFileDescriptor相關方法並使用getFileDescriptor時。它很好地工作。

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); 
     } 
    } 
} 

並從內存文件中創建文件描述符。

FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile); 
0

MemoryFile可用於映射到物理內存。結果文件描述符(fd)可以傳遞給客戶端(內存共享端)。客戶端可以將相同的本地fd映射到相同的內存區域。然後可以使用本地fd共享內存,可以使用InputStream將其映射到java層。

請參考此鏈接瞭解詳情:
Sharing memory using ashem.