Я хочу записать несколько байтов в общую память. Это делается в моем приложении1. Из моего другого приложения: application2 Я хочу получить доступ к этой общей памяти, чтобы читать записанные байты. Для этого я попытался использовать класс android MemoryFile. Я застрял, как ссылаться на одну и ту же память осколков между двумя различными приложениями. Я также запутался, если memoryFile используется для той же цели или нет. http://developer.android.com/reference/android/os/MemoryFile.html эта ссылка, которую я нашел по теме. Заранее спасибо. Кришна
Что использует MemoryFile в android
Ответ 1
Если вы хотите использовать несколько кросс-процессов с помощью 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)
.
Ответ 2
Я подозреваю, что файлы памяти не имеют метода 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);
Ответ 3
MemoryFile можно использовать для отображения в физическую память. Дескриптор файла результата (fd) может быть передан клиенту (сторона совместного использования памяти). Клиент может сопоставить один и тот же родной fd с той же областью памяти. Затем память может быть передана с использованием встроенного fd, который можно сопоставить с java-слоем с помощью InputStream.
Для получения дополнительной информации см. эту ссылку:
Совместное использование памяти с помощью ashem.