2011-11-17 23 views
12

Paylaşılan bir belleğe bazı baytlar yazmak istiyorum. Bu benim uygulamasında1 yapılır. Başka bir uygulamadan: application2 Yazılı baytları okumak için bu paylaşımlı belleğe erişmek istiyorum. Bu amaçla android'in MemoryFile sınıfını kullanmayı denedim. İki farklı uygulama arasında aynı shard belleğe nasıl başvuracağım gibi takılıyorum. Aynı zamanda memoryFile aynı amaç için kullanılıp kullanılmadığı konusunda da şaşkınım. http://developer.android.com/reference/android/os/MemoryFile.html bu konuyla ilgili buldum. Şimdiden teşekkürler. İsterseniz Krishnaandroid içinde MemoryFile kullanımı nedir

+2


Gidecek "resmi" yolu bir içerik sağlayıcısını kullanmak veya harici depolama düzenli dosyası kullanmak olduğunu düşünüyorum. ContentProvider/ContentResolver –

+1

+1 içeriğin boyutu büyüktür (3-4 MB) ve hızlı okuma yazma ihtiyacım var, bu yüzden paylaşılan bellek gibi bir şeye ihtiyacım var. Ayrıca Android'de memoryFile kullanımını anlamama yardımcı olabilirseniz lütfen. – Guillaume

+0

için –

cevap

12

kullanabilirsiniz MemoryFile bazı çapraz süreç kullanımı şu fugly yöntemi:

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

Ne bakıyorsun olmalıdır Bir uygulamasından dönebilirsiniz #getParcelFileDescriptor(MemoryFile) yöntemdir ContentProvider#openFile(Uri, String).

+1

Kodumun istisnasını MemoryFile.class.getDeclaredMethod ("getParcelFileDescriptor"); ama gerçekten sadece bir breakpoint koyarak o zaman yakalayama bilmiyorum catch cümlecik yok –

+0

Gerçekten alamadım. Yaptığınız her şey bir FD'den geçiyorsa, neden ashmem'i kullanıyorsunuz? ParcelFileDescriptor.createPipe() yöntemini kullanabilir ve istediğiniz tüm yerel verileri yazabilirsiniz. Hiçbir külmem gerekli. –

3

Bellek dosyalarının getParcelFileDescriptor yöntemine sahip olmadığından şüpheleniyorum. Bu getParcelFileDescriptor ile ilgili yöntemleri yorumladı ve getFileDescriptor kullanın. Güzel çalıştı.

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

Ve dosya tanıtıcısını bellek dosyasından oluşturdu.

FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile); 
0

MemoryFile, fiziksel belleğe eşlemek için kullanılabilir. Sonuç dosya tanıtıcısı (fd) istemciye (bellek paylaşım tarafı) geçirilebilir. İstemci aynı yerel fd'yi aynı bellek bölgesine eşleyebilir. Bellek daha sonra InputStream kullanılarak java katmanına eşleştirilebilen native fd kullanılarak paylaşılabilir.

fazla ayrıntı için bu bağlantıya başvurabilirsiniz: Sharing memory using ashem.