Bitmap / Canvas uso y el NDK

Recientemente descubrí que no existe un límite estricto para la cantidad de memoria que el código NDK puede asignar, en contraste con la cantidad muy limitada de memoria (~ 25 Mb en la mayoría de los dispositivos) que puede asignar en el lado de Java.

Quiero escribir una aplicación de procesamiento de imágenes (algo así como Photoshop) que necesita mantener varios mapas de bits grandes en la memoria a la vez, donde los datos del bitmap tomarán ~ 20Mb de memoria. Hacer esto en Java hace que la aplicación sea propensa a excepciones de memoria en muchos dispositivos que he probado.

Todo mi código actual hace uso de la clase Bitmap y Canvas para hacer mis manipulaciones de imagen. ¿Alguien puede sugerir alguna forma que me permita asignar la mayor parte de mi memoria en el lado C y seguir utilizando Bitmap + Canvas para realizar mis operaciones de dibujo (con Android 2.1 y superior)?

Como ejemplo, si mi imagen está compuesta de 6 capas de bitmap y el usuario está pintando en la tercera capa, necesito dibujar un bitmap de manchas de pintura en la tercera capa y luego actualizar la pantalla para mostrar el resultado de allanar todas las capas en la parte superior el uno del otro en tiempo real. He considerado algo como alinear mis 6 mapas de bits en C como matrices int y realizar la operación de pintura en el lado de Java con Canvas utilizando una copia de la capa que se está editando almacenada en un objeto Bitmap. Aunque no estoy seguro de cómo va a funcionar la etapa de aplanamiento.

Echa un vistazo a la muestra “bitmap-plasma” en el NDK. Crea un bitmap en Java y manipula los bits en código nativo. Una técnica posible es que puede asignar los bloques grandes de memoria y mantener sus imágenes en código nativo y simplemente representar una “vista” en un bitmap creado por Java. El método para renderizar la vista y hacer el “aplanamiento” de sus capas de imagen probablemente debería realizarse en código nativo. Algo a lo largo de las líneas de:

… el usuario cambió una capa …

My_native_render_code (MyDisplayBitmap);

invalidar();