Я уже написал простую программу общей памяти C в Linux.
Как использовать общую память (или я должен ее называть «ashmem?») В Android?
Надеюсь, вы можете дать мне пошаговое руководство.Как использовать общую память (IPC) в Android
ответ
Процесс создает новую область 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);
и, вуаля! Мгновенная общая память.
Использовать связующее IPC в Android. Я думаю, что связующее использует память ядра, которая является общей для всех процессов, для взаимодействия между процессами.
Вот что сработало для меня:
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.
Затем отображаемая область памяти может быть прочитана/записана службой &.
Ну, если вы хотите использовать API разделяемой памяти здесь является решение https://github.com/pelya/android-shmem
Как магии, она прекрасно работает. Вы можете использовать разделяемую память в android через независимые процессы, используя shmget(), shmat() и shmdt() API. Попробуйте.
- 1. Могу ли я использовать общую память или другой IPC
- 2. Как использовать именованную общую память?
- 3. Использование Thrift для IPC-связи через общую память
- 4. IPC через общую память с atomic_t; это хорошо для x86?
- 5. Как использовать общую память в собственном коде Android?
- 6. родительский процесс и дочерний процесс совместно используют общую память IPC
- 7. Когда использовать Pipes vs Когда использовать общую память
- 8. Как использовать общую память с Golang?
- 9. Как использовать общую память правильно под окнами
- 10. IPC: общая память уничтожена в процессе обработки
- 11. Как профилировать общую память?
- 12. Кто может совместно использовать общую память в Linux?
- 13. Можно ли загрузить dll в общую память?
- 14. Запись в общую память
- 15. Использовать общую память для соседних элементов массива?
- 16. - это возможность использовать общую память для fftw?
- 17. Как можно использовать общую память GPU в Matlab?
- 18. минимизировать общую память STRUCT
- 19. Android Как получить общую память памяти в устройстве?
- 20. Ввод структуры в общую память
- 21. Как написать в общую память на C++?
- 22. Как заблокировать общую память в php (shmop)
- 23. Python: Как оценить общую память, которую будет использовать мой алгоритм?
- 24. Как использовать общую память между вызовом ядра CUDA?
- 25. Как смочить структуру как общую анонимную память?
- 26. Создать огромную страницу разделяемой память для IPC в Linux
- 27. Как получить общую память и внутренний размер памяти Android?
- 28. Android: Как вы получаете внутреннюю общую/доступную память?
- 29. копирование в общую память в cuda
- 30. Проверить общую память Redis v2.8
Можно ли это сделать и в Android x86? – 2013-04-22 06:05:03
Да, конечно. –
Я снова человек ... Используя AOSP, я создал программу «Hello World», которая может запускаться изначально на Android. Я хотел, чтобы программа «Hello World» имела возможность пепельницы. Является ли это возможным? – 2013-06-27 06:54:06