Me gustaría escribir una aplicación para Android que muestre cosas en la pantalla usando el framebuffer. Esto se ejecutará solo en un dispositivo rooteado específico, por lo que los permisos, etc., no son un problema. La misma aplicación (versión de prueba simple de todos modos) ya funciona correctamente en PC/Linux.
Las preguntas:
¿Cómo evitar que el sistema operativo Android acceda al framebuffer? Me gustaría, mientras se ejecuta mi aplicación, que el sistema operativo nunca toque el búfer de fotogramas, no escriba ni ioctls. ¿Qué debo hacer para obtener el uso exclusivo del framebuffer y luego (cuando mi aplicación se cierra) devolverlo al sistema operativo?
¿Hay alguna diferencia entre el framebuffer de Android y el framebuffer de Linux a tener en cuenta?
PD: Me gustaría iniciar mi aplicación como una aplicación normal de Android (con algún código nativo), simplemente no tiene una interfaz de usuario visible, excepto por los dibujos de framebuffer que ocupan toda la pantalla. Sería bueno poder obtener eventos del sistema operativo.
Consulte también: http://www.kandroid.org/online-pdk/guide/display_drivers.html
Hola, Alex. No estoy seguro de por qué / cómo evitar que el sistema operativo Android escriba en framebuffer. Siempre que su aplicación de Android esté visible y en la parte superior tenga el control de lo que desea mostrar.
Su aplicación debe tener una actividad con SurfaceView (es posible que desee que su aplicación oculte la barra de notificaciones, llame a esta función al crear su actividad) requestWindowFeature(Window.FEATURE_NO_TITLE); )
su actividad debe tener la implementación SurfaceHolder.Callback para manejar las devoluciones de llamada cuando la superficie está lista para llenarse con framebuffer. Obtenga el objeto de soporte de superficie como SurfaceView.getHolder() en caso de que desee establecer formatos de píxeles de la vista, etc.
Una vez que se llama la devolución de llamada " surfaceCreated ", puede pasar con seguridad su objeto de vista de superficie (pasar el ancho y la altura, tal vez también sea una buena idea) al nativo para que pueda llenarlo con la clase "ANativeWindow".
Verifique el código de muestra de NDK para ver cómo usar la documentación de clase NDK
Documentación de SurfaceHolder.Callback
Documentación de SurfaceHolder
esencialmente necesitas estos (ON JB /Kitkat)
obtenga la ventana nativa (ANativeWindow) asociada con la vista de superficie por ANativeWindow_fromSurface .
Adquiera un bloqueo en ANativeWindow mediante ANativeWindow_acquire .
Establecer parámetros de geometría (ventana, ancho, alto, pf) para la ventana nativa por ANativeWindow_setBuffersGeometry
Cargue la ventana nativa con el frambuffer almacenado (aplique un rectángulo sucio, si lo hay aquí) por ANativeWindow_lock
Paso final para desbloquear y publicar los cambios para renderizar por ANativeWindow_unlockAndPost
Revise los ejemplos de muestra de ndk en caso de que necesite un código de muestra. Documentación del NDK