Замена 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. Вы также можете посмотреть на это.

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

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

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

Другие вопросы по тегам