我想将一些字节写入共享内存。这是在我的application1中完成的。从我的另一个应用程序:application2我想访问该共享内存来读取写入的字节。为此,我尝试使用android的MemoryFile类。我被困在如何在两个不同的应用程序之间引用相同的分片内存。如果memoryFile用于相同的目的,我现在也很困惑。 http://developer.android.com/reference/android/os/MemoryFile.html我发现这个主题的链接。 提前致谢。 克里希纳
答案 0 :(得分: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 :(得分: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);
答案 2 :(得分:0)
MemoryFile可用于映射到物理内存。结果文件描述符(fd)可以传递给客户端(内存共享端)。客户端可以将相同的本机fd映射到相同的内存区域。然后可以使用本机fd共享内存,可以使用InputStream将其映射到java层。
有关详细信息,请参阅此链接:
Sharing memory using ashem.