Compartir memoria entre dos procesos en Dalvik

He creado un servicio del androide que expone una interfaz a las aplicaciones para aceptar una matriz del byte de la estructura de la cámara. El servicio utiliza una biblioteca nativa para procesar este marco de cámara y devuelve algunos datos sobre el marco de la cámara. El objetivo es poder procesar fotogramas de previsualización de cámara en tiempo real.

Problema – Mi archivo AIDL tiene una API llamada initFrame (en el marco byte []). Cada vez que llamo a esta API de una aplicación (que se ejecuta en un proceso separado), recibo una excepción – TransactionTooLargeException

Esto se debe a que el tamaño de la matriz de bytes es> 1 MB y el binder buffer de transacción tiene un tamaño fijo limitado de 1 MB. Incluso si el tamaño límite era mayor, es muy ineficiente copiar grandes búferes para el procesamiento en tiempo real.

Pregunta – ¿Hay alguna manera en android para compartir memoria entre dos procesos de dalvik que pueden ayudar a resolver el problema? Miré MemoryFile pero parece MemoryFile sólo se puede utilizar para compartir memoria entre los procesos que utilizan APIs ocultas en este momento.

Yo usaría una conexión de socket entre los 2 procesos para este tipo de transacción. Ambas partes pueden transmitir los datos y el búfer como sea necesario, sin atar una gran cantidad de recursos. Debe ser relativamente fácil para su servicio escuchar en un socket y hacer que los clientes se conecten al socket y envíen datos.

Echa un vistazo al subsistema ashmem que es un asignador de memoria compartida, similar a POSIX SHM, pero con un comportamiento diferente y deportivo una API basada en archivos más simple.

Tal vez es lo que está buscando:

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); 

Esto se define en system/core/include/cutils/ashmem.h .

Si puede modificar el sistema Android, puede ampliar el tamaño de la transacción. El binder buffer de transacción tiene un tamaño fijo limitado, actualmente 1Mb

Hay un parámetro en ProcessState.cpp

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

Intente aumentar este valor.

Si no puede hacer esto, trate de separar sus datos en varias transacciones.

Por otra parte, puede tomar otro mecanismo IPC como el empleo de código nativo para utilizar ashmem en system/core/include/cutils/ashmem.h . No es difícil. Por lo que sé, algunos proveedores utilizan ashmem para implementar las transacciones de fichero en algunos kernels sin soporte de controlador de enlace. También puede utilizar socket.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.