2013-02-27 2 views
11

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

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

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

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

ответ

3

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

3

Посмотрите на 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.

+1

Я смотрел на пепельницу, но как использовать пепельницу в моем приложении JAVA? Я не хочу обременять приложение NDK. –

+1

Это приложение, которое показывает, как использовать ashmem для mmap между различными приложениями/между родными C и Java. https://github.com/vecio/AndroidIPC – user3387542

3

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

Там есть параметр в ProcessState.cpp

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2)) 

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

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

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

+0

Каковы риски, если таковые имеются, увеличения этого значения? – barq

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