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

时间:2014-01-25 09:13:14

标签: android c linux graphics framebuffer

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

问题:

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

  2. Android framebuffer和Linux framebuffer之间是否有任何差异需要注意?

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

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

1 个答案:

答案 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

SurfaceHolder documentation

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

  1. 通过ANativeWindow_fromSurface获取与surfaceview关联的原生窗口(ANativeWindow)。

  2. 通过ANativeWindow_acquire获取ANativeWindow的锁定。

  3. ANativeWindow_setBuffersGeometry

  4. 设置本地窗口的几何参数(窗口,宽度,高度,pf)
  5. 加载存储了frambuffer的nativewindow(如果在这里应用脏矩形) ANativeWindow_lock

  6. 通过ANativeWindow_unlockAndPost

  7. 解锁并发布更改以进行渲染的最后一步

    如果您需要示例代码,请浏览ndk示例示例。NDK documentation