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

5
我正在开发一个需要访问OpenGL ES 2.0纹理像素的Android NDK应用程序。
OpenGL扩展允许使用GraphicBuffer类来实现此功能,例如在这里, 这里这里中所述。所有这些方法都需要使用GraphicBuffer类,但该类不是NDK的一部分(例如在这里中)。显然,这需要访问私有的C ++ Android API(来自AOSP-Android Open Source Project)。

首先,如果我实际构建并链接AOSP repo,我的应用程序是否能在与“纯”NDK版本相同的Android设备上运行?
有人能提供详细的指导说明以及这样做的利弊吗?

其次,Android的 "图形架构" 文档 中写道:

ANativeWindow

公共的Surface类是用Java编写的。在C/C++中等效的是ANativeWindow类, 可以通过Android NDK半暴露地使用。您可以使用ANativeWindow_fromSurface()调用从Surface获取ANativeWindow。 就像它的Java语言近亲一样,您可以锁定它,使用软件渲染,并解锁和发布。

要从本机代码创建EGL窗口表面,需要将EGLNativeWindowType的实例传递给eglCreateWindowSurface()。 EGLNativeWindowType只是ANativeWindow的一个同义词,因此您可以自由地将其转换为另一个。

根据thisGraphicBuffer是对ANativeWindowBuffer的“简单包装”。因此,第二个问题是:是否可能仅使用EGL和NDK函数(无需AOSP)创建与GraphicBuffer兼容的OpenGL纹理表面?如果可以,如何实现?
1个回答

2

从您的第二个问题开始,我认为没有这样的方法。如果您想将代码仅保留在本地端,则必须使用GraphicBuffers。虽然像iOS一样暴露此类功能会很棒,但我怀疑它是否会发生。

您不需要构建AOSP来使用GraphicBuffers。只需获取定义结构的一些标头并将其用于您的代码中。然后使用dlopen()dlsym()获取所需函数的指针,并使用它们。如您最后一个链接所述,请检查system/core/include/system/window.hframeworks/native/include/ui/GraphicBuffer.h。混淆的函数名称使得编写代码非常麻烦,但它确实有效。Firefox源代码中有一个很好的使用示例。


如果可以的话,我不介意通过JNI调用Java。 Java是否有一个不是私有的“GraphicBuffer”等效物? - Adi Shavit
你可以在Java中渲染到一个Surface,然后将该Surface传递给本地端并获取ANativeWindow,并读取像素。这里有一个示例:https://vec.io/posts/how-to-render-image-buffer-in-android-ndk-native-code. - user1906
你不能仅创建一个Surface,但你可以创建一个SurfaceView,然后从中获取Surface。这可能有点复杂。在我最近的几个项目中,我选择了GraphicBuffer路线。现在Renderscript支持NDK,这可能是另一种解决方案? - user1906
我的应用程序已经被广泛安装,因此我不想冒私有API的风险(也不希望进行复杂的构建过程)。您认为SurfaceView路线比解开函数名称等更加复杂吗?您能否指向一些类似使用SurfaceView的文档或示例(即JNI到OpenGL纹理)? - Adi Shavit
好的,谢谢。你能提供一个直接链接到显示这个的Firefox代码吗? - Adi Shavit
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接