Замена SHM на основе ASHMEM
Я работаю над портом библиотеки от *nix до Android, и библиотека использует общую память или shm
, Android не имеет System V shm
, Вместо этого он использует ashmem
,
Кто-нибудь знает о библиотеке подкладок для отображения shm
призывает в ashmem
? Гугл не очень помог.
2 ответа
Вот как это работало для меня при работе с похожей проблемой портирования:
Вместо того чтобы использовать shmfd = open(SHM_PATH, O_RDWR) для создания и получения файлового дескриптора, я заменил его на
int fd = ashmem_create_region("SharedRegionName", size);
и использовал дескриптор файла, чтобы получить базовый адрес:
int base_address = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
Вы можете передать base_address в свой Java-код из собственного кода, используя встроенную функцию, которая возвращает дескриптор.
В Android есть класс-оболочка для Ashmem с именем MemoryFile. Вы также можете посмотреть на это.
Следующие ссылки помогли мне создать мою собственную обертку:
- http://notjustburritos.tumblr.com/post/21442138796/an-introduction-to-android-shared-memory
- http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/os/MemoryFile.java
- https://github.com/cozybit/aosp-frameworks-base/blob/master/core/jni/android_os_MemoryFile.cpp
Вот библиотека, с помощью которой вы можете LD_PRELOAD имитировать разделяемую память Linux с помощью Android ashmem (вызовы shmget/shmat/shmdt/shmctl), вы также можете напрямую ссылаться на эту библиотеку.