Подтвердить что ты не робот

Обмен памятью между двумя процессами в Дальвике

Я создал службу android, которая предоставляет интерфейс приложениям для приема массива байтов камеры. Служба использует собственную библиотеку для обработки кадра этой камеры и возвращает некоторые данные о кадре камеры. Цель состоит в том, чтобы обрабатывать кадры предварительного просмотра камеры в реальном времени.

Проблема. В моем файле AIDL есть API под названием initFrame (в байт []). Всякий раз, когда я вызываю этот API из приложения (работает в отдельном процессе), я получаю исключение - TransactionTooLargeException

Это связано с тем, что размер массива байтов составляет > 1 МБ, а буфер транзакции связующего имеет ограниченный фиксированный размер 1 МБ. Даже если предел размера был больше, очень неэффективно копировать большие буферы для обработки в реальном времени.

Вопрос. Есть ли способ в android для обмена памятью между двумя процессами dalvik, которые могут помочь решить проблему? Я посмотрел на MemoryFile, но, похоже, MemoryFile может использоваться только для совместного использования памяти между процессами с использованием скрытых API в этой точке.

4b9b3361

Ответ 1

Я бы использовал соединение сокета между двумя процессами для этого типа транзакции. Обе стороны могут передавать данные и буферизировать по мере необходимости, не связывая много ресурсов. Для вашего сервиса должно быть относительно легко прослушивать сокет и подключать клиентов к сокету и отправлять данные.

Ответ 2

Взгляните на подсистему ashmem, которая является распределителем разделяемой памяти, похожей на POSIX SHM, но с другим поведением и более простым файловым API.

Возможно, это то, что вы ищете:

int ashmem_create_region(const char *name, size_t size);
int ashmem_set_prot_region(int fd, int prot);
int ashmem_pin_region(int fd, size_t offset, size_t len);
int ashmem_unpin_region(int fd, size_t offset, size_t len);
int ashmem_get_size_region(int fd);

это определено в system/core/include/cutils/ashmem.h.

Ответ 3

Если вы можете изменить систему Android, вы можете увеличить размер транзакции. Буфер транзакции Binder имеет ограниченный фиксированный размер, в настоящее время 1Mb

В ProcessState.cpp

есть параметр,
#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2))

попробуйте увеличить это значение.

Если вы не можете этого сделать, попробуйте разделить ваши данные на несколько транзакций.

Кроме того, вы можете использовать другой механизм IPC, например, использовать собственный код для использования ashmem в system/core/include/cutils/ashmem.h. Это не сложно. Насколько я знаю, некоторые производители используют ashmem для реализации транзакций связующего на некоторых ядрах без поддержки драйверов связующего. Вы также можете использовать сокет.