我想编写一个Android应用程序,它使用framebuffer在屏幕上显示内容。这将仅在特定的root设备上运行,因此权限等不是问题。相同的应用程序(无论如何简单的测试版本)已经在PC / Linux上正常运行。
问题:
如何避免Android操作系统访问帧缓冲区?我想,在我的应用程序运行时,让操作系统从不触摸帧缓冲区,没有写入和没有ioctl。我需要做什么才能独占使用帧缓冲,然后(当我的应用程序退出时)将其返回给操作系统?
Android framebuffer和Linux framebuffer之间是否有任何差异需要注意?
P.S。我想将我的应用程序作为常规Android应用程序(带有一些本机代码)启动,它除了用于接管整个屏幕的帧缓冲区绘制外,没有可见的UI。能够从操作系统获取事件会很高兴。
另见: http://www.kandroid.org/online-pdk/guide/display_drivers.html
答案 0 :(得分:5)
嗨Alex不知道为什么/如何阻止Android OS写入framebuffer。只要您的Android应用程序可见并且在顶部,您就可以将控件作为您想要显示的内容。
您的应用程序应该有一个SurfaceView活动(您可能希望您的应用程序隐藏通知栏,在您的活动创建时调用此函数)
requestWindowFeature(Window.FEATURE_NO_TITLE);
)
你的活动应该有 SurfaceHolder.Callback 实现来处理回调,就像表面准备填充帧缓冲一样。获取SurfaceView对象作为SurfaceView.getHolder(),你想要设置视图的像素格式等。
一旦调用了“ surfaceCreated ”回调,你就可以安全地将你的surfaceview对象(传递宽度和高度也可能是一个好主意)传递给本机,这样你就可以使用“ANativeWindow”类填充它的帧缓冲。
检查NDK示例代码,了解如何使用课程NDK documentation
SurfaceHolder.Callback documentation
基本上你需要这些(ON JB / Kitkat)
通过ANativeWindow_fromSurface
获取与surfaceview关联的原生窗口(ANativeWindow)。
通过ANativeWindow_acquire
获取ANativeWindow的锁定。
按ANativeWindow_setBuffersGeometry
加载存储了frambuffer的nativewindow(如果在这里应用脏矩形)
ANativeWindow_lock
通过ANativeWindow_unlockAndPost
如果您需要示例代码,请浏览ndk示例示例。NDK documentation