在 Android NDK 上创建映射/直接 OpenGL ES 纹理

Creating a Mapped/Direct OpenGL ES Texture on Android NDK

本文关键字:直接 OpenGL ES 纹理 映射 Android NDK 创建      更新时间:2023-10-16

我正在开发一个需要访问OpenGL ES 2.0纹理像素的Android NDK应用程序。

OpenGL扩展允许按照此处,此处和此处所述执行此操作。
所有这些方法都需要使用不属于 NDK 的 GraphicBuffer 类(例如,请参阅此处(。显然,这需要访问私有C++Android API(来自AOSP-Android开源项目(。

首先,如果我实际构建并链接到 AOSP 存储库,我的应用程序是否会在与"纯"NDK 版本相同的 Android 设备上运行?
任何人都可以提供(参考(有关如何执行此操作以及执行此操作的利弊的详细说明吗?

其次,Android的"图形架构"文档指出:

分析窗口

公共 Surface 类在 Java 编程中实现 语言。C/C++ 中的等效项是 ANativeWindow 类, 由Android NDK半暴露。您可以从 使用 ANativeWindow_fromSurface(( 调用的图面。就像它一样 Java语言表亲,你可以锁定它,在软件中渲染,以及 解锁并发布。

若要从本机代码创建 EGL 窗口图面,请传递一个实例 的EGLNativeWindowType to eglCreateWindowSurface((。 EGLNativeWindowType 只是 ANativeWindow 的同义词,所以你可以 自由地将一个投射到另一个。

根据这个GraphicBufferANativeWindowBuffer上的"简单包装器"。

所以第二个问题是:是否可以仅使用 EGL 和 NDK 函数(不需要 AOSP(来创建像 GraphicBuffer 这样的 OpenGL 纹理兼容表面?如果是这样,怎么办?

从你的第二个问题开始,我认为没有。如果只想将代码保留在本机端,则必须使用 GraphicBuffers。公开这样的功能会很棒(iOS 有核心视频像素缓冲区(,但我怀疑它永远不会发生。

您实际上不需要构建AOSP来使用GraphicBuffers。只需获取一些定义结构的标头,并在代码中使用它们。然后使用 dlopen()dlsym() 获取指向所需函数的指针,并使用它们。正如您的最后一个链接所指出的,请检查system/core/include/system/window.hframeworks/native/include/ui/GraphicBuffer.h 损坏的函数名称使代码编写起来很痛苦,但它有效。在 Firefox 源代码中有一个很好的使用示例。