Adi*_*vit 5 c++ android opengl-es android-ndk
我正在开发一个 Android NDK 应用程序,需要访问 OpenGL ES 2.0 纹理的像素。
OpenGL 扩展允许执行此操作,如此处、此处和此处所述。
所有这些方法都需要使用不属于 NDK 的GraphicBuffer类(请参见此处)。显然,这需要访问私有 C++ Android API(来自 AOSP-Android 开源项目)。
首先,如果我实际构建并链接到 AOSP 存储库,我的应用程序是否会在与“纯”-NDK 版本相同的 Android 设备上运行?
任何人都可以提供(参考)有关如何执行此操作以及执行此操作的优点/缺点的详细说明吗?
其次,Android的《图形架构》文档指出:
原生窗口
公共 Surface 类是用 Java 编程语言实现的。C/C++ 中的等效项是 ANativeWindow 类,由 Android NDK 半公开。您可以使用 ANativeWindow_fromSurface() 调用从 Surface 获取 ANativeWindow。就像它的 Java 语言表亲一样,您可以锁定它、在软件中渲染以及解锁并发布。
要从本机代码创建 EGL 窗口表面,请将 EGLNativeWindowType 的实例传递给eglCreateWindowSurface()。EGLNativeWindowType 只是 ANativeWindow 的同义词,因此您可以自由地将一个窗口转换为另一个窗口。
据此,这 GraphicBuffer是一个“简单的包装器” ANativeWindowBuffer。
所以第二个问题是:是否可以GraphicBuffer通过仅使用 EGL 和 NDK 函数(不需要 AOSP)来创建 OpenGL 纹理兼容的表面?如果是这样怎么办?
从你的第二个问题开始,我认为不存在。如果您只想将代码保留在本机端,则必须使用 GraphicBuffers。如果能有这样的功能就太好了(iOS 有核心视频像素缓冲区),但我怀疑这是否会发生。
您实际上不需要构建 AOSP 来使用 GraphicBuffers。只需获取一些定义结构的标头并在代码中使用它们即可。然后使用dlopen()和dlsym()获取指向所需函数的指针,并使用它们。正如您的最后一个链接所指出的,检查system/core/include/system/window.h并frameworks/native/include/ui/GraphicBuffer.h修改函数名称使代码编写起来很痛苦,但它有效。Firefox 源代码中有一个很好的使用示例。
| 归档时间: |
|
| 查看次数: |
2063 次 |
| 最近记录: |