Замена SHM на основе ASHMEM
Я работаю над портом библиотеки от *nix до Android, и библиотека использует общую память или shm
. Android не имеет System V shm
. Вместо этого он использует ashmem
.
Известно ли кому-нибудь о библиотеке оболочек для отображения вызовов shm
в ashmem
? Google не был очень полезен.
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