为了在 Android NDK 上获得快速的 OpenGL ES 2.0 纹理像素访问,我想使用 eglCreateImageKHR()
扩大。
根据 EGL_NATIVE_BUFFER_ANDROID
docs :
This extension enables using an Android window buffer (struct
ANativeWindowBuffer
) as anEGLImage
source.
ANativeWindowBuffer
是一个内部 struct
由 native 框架类使用,如 GraphicBuffer
.
不幸的是,由于我使用的是 NDK,因此我无法直接访问这些类。
NDK native_window
接口(interface)允许我传递 Java Surface
对象到 NDK。然后我可以使用 ANativeWindow_fromSurface()
得到一个不透明的 ANativeWindow*
处理。有了这个指针,我可以调用 ANativeWindow_lock()
填充 ANativeWindow_Buffer
类型的结构(注意 _
)。
如果我尝试使用这个 &ANativeWindow_Buffer
对象 eglCreateImageKHR()
它失败了 EGL_BAD_NATIVE_WINDOW
.
我的问题是:如何使用 ANativeWindow_Buffer
与 eglCreateImageKHR()
或者如何获得 ANativeWindowBuffer
来自 ANativeWindow_Buffer
或来自 ANativeWindow*
.
最佳答案
根据我在走这条路时发现的情况,ANativeWindow_Buffer
和 ANativeWindowBuffer
是完全不同的类型。嗯,它们有些相似,但绝对不同,不能互换使用。
如果要比较,这里是定义:
ANativeWindow_Buffer
:http://androidxref.com/4.4.4_r1/xref/prebuilts/ndk/current/platforms/android-18/arch-arm/usr/include/android/native_window.hANativeWindowBuffer
:http://androidxref.com/4.4.4_r1/xref/system/core/include/system/window.h
你会注意到它们有一些共同的字段(width
、height
、stride
、format
).最大的区别在于 ANativeWindow_Buffer
包含指向实际数据的指针,而 ANativeWindowBuffer
包含类型为 buffer_handle_t
的不透明句柄。
因此,如果您发现了如何获得 ANativeWindow_Buffer
,并且希望您能顺利获得 ANativeWindowBuffer
,那么您...可能不是.至少那是我的结论。我认为非常相似的名字只是一种戏弄。
我没有找到从 NDK 代码创建 ANativeWindowBuffer
的方法。至少在仅使用受支持的 API 的情况下,我认为这是不可能的。我的研究是关于 KitKat。
关于android - 从 ANativeWindow_Buffer 获取 ANativeWindowBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27525380/