如何在Android上使用framebuffer进行绘制?

Ale*_*x I 9 c linux graphics android framebuffer

我想编写一个Android应用程序,它使用framebuffer在屏幕上显示内容.这将仅在特定的root设备上运行,因此权限等不是问题.相同的应用程序(无论如何简单的测试版本)已经在PC/Linux上正常运行.

问题:

  1. 如何避免Android操作系统访问帧缓冲区?我希望,在我的应用程序运行时,操作系统永远不会触摸帧缓冲区,没有写入和没有ioctl.我需要做什么才能独占使用framebuffer,然后(当我的应用程序退出时)将其返回给操作系统?

  2. Android framebuffer和Linux framebuffer之间有什么区别需要注意吗?

PS我想将我的应用程序作为常规Android应用程序(带有一些本机代码)启动,它除了用于接管整个屏幕的帧缓冲区绘制外,没有可见的UI.能够从操作系统获取事件会很高兴.

另见:http: //www.kandroid.org/online-pdk/guide/display_drivers.html

amI*_*mIT 6

嗨亚历克斯不知道为什么/如何阻止Android操作系统写入帧缓冲.只要您的Android应用程序可见并且在顶部,您就可以将控件作为您想要显示的内容.

您的应用程序应该有一个SurfaceView活动(您可能希望您的应用程序隐藏通知栏,在您的活动的创建时调用此函数) requestWindowFeature(Window.FEATURE_NO_TITLE);)

你的活动应该有 SurfaceHolder.Callback实现来处理回调,就像表面准备填充帧缓冲一样.获取SurfaceView对象作为SurfaceView.getHolder(),你想要设置视图的像素格式等.

一旦调用了" surfaceCreated "回调,你就可以安全地将你的surfaceview对象(传递宽度和高度也可能是一个好主意)传递给本机,这样你就可以使用"ANativeWindow"类填充帧缓冲.

检查NDK示例代码以了解如何使用NDK文档

SurfaceHolder.Callback文档

SurfaceHolder文档

基本上你需要这些(ON JB/Kitkat)

  1. 获取与surfaceview关联的本机窗口(ANativeWindow)ANativeWindow_fromSurface.

  2. 获取ANativeWindow上的锁定ANativeWindow_acquire.

  3. 设置本机窗口的几何参数(窗口,宽度,高度,pf) ANativeWindow_setBuffersGeometry

  4. 加载本机窗口并存储frambuffer(如果有的话,应用脏矩形) ANativeWindow_lock

  5. 解锁和发布更改以进行渲染的最后一步 ANativeWindow_unlockAndPost

如果您需要示例代码,请浏览ndk示例示例.NDK文档