Замена SHM на основе ASHMEM


Я работаю над портом библиотеки от *nix до Android, и библиотека использует общую память или shm. Android не имеет System V shm. Вместо этого он использует ashmem.

Известно ли кому-нибудь о библиотеке оболочек для отображения вызовов shm в ashmem? Google не был очень полезен.

2 2

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. Вы также можете иметь взгляд в этом.

Следующие ссылки помогли мне создать мою собственную оболочку:

Вот библиотека, которую вы можете LD_PRELOAD для имитации общей памяти Linux с помощью Android ashmem (вызовы shmget/shmat/shmdt/shmctl), вы также можете напрямую связать с этой библиотекой.

Https://github.com/pelya/android-shmem