1

我一直在四处寻找,并找不到太多清晰的东西。背景是我有一个支持手写笔的电子墨水平板电脑,我在上面编程是为了好玩,我很想使用原生库来读取笔事件,并直接在帧缓冲区上绘图。供应商提供了一个秘密(一个 .so JNI 库,您可以只使用大小参数调用它)。

我想这是为了激活对帧缓冲区的直接绘制,最终进行刷新。但我无法理解它应该如何与 SurfaceFlinger 和 Android 组合......

任何人都有通过 IOCTL 从 JNI 显示的通用 eink 技巧的经验,这可以解释为什么我看不到像素发生变化,除非我在 java 中绘制自己(我可以更改更新模式并快速绘制,但是......我想要最快的) ?

如何验证 FB 上的写入?android 应用程序可以被直接写入帧缓冲区的像素“覆盖”吗?

4

2 回答 2

1

我最终想通了。使用 strace 通过 ioctl + lsof + 官方绘图应用程序的远程调试来捕获对 fb0 的调用表明我错了。

与非凡的不同,这个特定平板电脑的供应商软件不会通过魔术 ioctl 命令直接使用帧缓冲区。它所做的只是将屏幕区域注册为 Android 正常显示原语不可刷新。这使他们不必将层次结构中的每个视图都配置为直接更新 eink 模式,同时使用具有尽可能少的自定义代码的 android 框架。

我可以看到命令以这种方式传递:

[pid  3997] openat(AT_FDCWD, "/dev/graphics/fb0", O_RDWR|O_LARGEFILE) = 30
[pid  3997] ioctl(30, _IOC(0, 0x6d, 0x25, 0x00), 0x1) = 0
[pid  3997] close(30)   

这只是将屏幕锁定并停止所有 android 刷新。

这意味着他们可以更快。

于 2020-05-13T15:08:09.767 回答
0

我建议你用 C 语言为帧缓冲区编写一个基本的像素绘图程序。正常执行它,然后为它创建一个 JNI 调用。速度差异可以忽略不计。

于 2022-02-09T16:34:02.233 回答