2013-04-19 4 views

ответ

2

Процесс создает новую область ashmem со следующими шагами:

(1) Откройте файл устройства, «/ DEV/ashmem» и получить дескриптор файла. (2) Вызовите ASHMEM_SET_NAME ioctl, чтобы установить имя пепельницы. Это файл виртуального устройства, поэтому, если вы назовете его «my_mem», имя файла изменится на «/ dev/ashmem/my_mem». (3) Позвоните в ASHMEM_SET_SIZE ioctl, чтобы установить размер пепельницы в байтах.

Библиотека cutils имеет функцию «ashmem_create_region», которая оборачивает эти шаги в вызов одной функции:

int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20); 

Файл дескриптора может использоваться совместно с другими процессами. Android предоставляет специальный способ обмена файловыми дескрипторами между кузен-процессами, используя другой сервис под названием «связующее». Затем каждый процесс распаковывает файл:

char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE, 
             MAP_SHARED, fd, 0); 

и, вуаля! Мгновенная общая память.

+0

Можно ли это сделать и в Android x86? – 2013-04-22 06:05:03

+0

Да, конечно. –

+0

Я снова человек ... Используя AOSP, я создал программу «Hello World», которая может запускаться изначально на Android. Я хотел, чтобы программа «Hello World» имела возможность пепельницы. Является ли это возможным? – 2013-06-27 06:54:06

0

Использовать связующее IPC в Android. Я думаю, что связующее использует память ядра, которая является общей для всех процессов, для взаимодействия между процессами.

3

Вот что сработало для меня:
1) Открыть объект MemoryFile: mFile;
2) создать сервис, чтобы отобразить его в ashem с помощью mmap;
3) Верните собственный файловый дескриптор (fd) клиенту, который связывается с вашим сервисом, используя ParcelFileDescriptor pfd;
4) Создайте JNI для клиента, который принимает fd и карту в золу, используя mmap;
5) Создайте InputStream с помощью этого fd, и теперь клиент может читать/записывать одну и ту же область памяти, используя объект InputStream.
Это link показывает, как отобразить MemoryFile в ashem. В этом link показано, как отправить собственный клиентский дескриптор файла (fd) клиенту через AIDL и ParcelFileDescriptor для клиента.

На стороне сервера, вам нужно будет создать:
1) Служба & AIDL, который проходит родной для клиента FD через ParcelFileDescriptor; 2) JNI на стороне обслуживания, которая выполняет сопоставление.

На клиенте: 1) Методы привязки для обслуживания, а затем вызов службы для получения родного fd; 2) JNI, который отображает fd в ashem.

Затем отображаемая область памяти может быть прочитана/записана службой &.

0

Ну, если вы хотите использовать API разделяемой памяти здесь является решение https://github.com/pelya/android-shmem

Как магии, она прекрасно работает. Вы можете использовать разделяемую память в android через независимые процессы, используя shmget(), shmat() и shmdt() API. Попробуйте.

Смежные вопросы