android – 从ANativeWindow_Buffer获取一个ANativeWindowBuffer

前端之家收集整理的这篇文章主要介绍了android – 从ANativeWindow_Buffer获取一个ANativeWindowBuffer前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

为了在Android NDK上获得快速的OpenGL ES 2.0纹理像素访问,我想使用eglCreateImageKHR()扩展.

根据EGL_NATIVE_BUFFER_ANDROID docs

This extension enables using an Android window buffer (struct
ANativeWindowBuffer@H_403_11@) as an EGLImage@H_403_11@ source.

ANativeWindowBuffer是本机框架类(如GraphicBuffer)使用的内部结构.
不幸的是,因为我在NDK上,所以我无法直接访问这些类.

NDK native_window接口允许我将Java Surface对象传递给NDK.然后我可以使用ANativeWindow_fromSurface()来获得不透明的ANativeWindow *句柄.使用此指针,我可以调用ANativeWindow_lock()来填充ANativeWindow_Buffer类型的结构(注意_).

如果我尝试将此& ANativeWindow_Buffer对象与eglCreateImageKHR()一起使用,则它会失败并显示EGL_BAD_NATIVE_WINDOW.

我的问题是:如何将ANativeWindow_Buffer与eglCreateImageKHR()一起使用,或者如何从ANativeWindow_Buffer或ANativeWindow *获取ANativeWindowBuffer.

最佳答案
从我在走这条路的过程中发现,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.h
> ANativeWindowBuffer:http://androidxref.com/4.4.4_r1/xref/system/core/include/system/window.h

您会注意到它们有一些共同的字段(宽度,高度,步幅,格式).最大的区别是ANativeWindow_Buffer包含指向实际数据的指针,而ANativeWindowBuffer包含一个类型为buffer_handle_t的不透明句柄.

所以,如果你发现如何获得一个ANativeWindow_Buffer,并希望你在前往ANativeWindowBuffer的路上走得很好,那么你可能就没有了.至少那是我的结论.我认为非常相似的名字只是一个挑逗.

我没有找到从NDK代码创建ANativeWindowBuffer的方法.至少只使用支持的API,我相信这是不可能的.我的研究是与KitKat进行的.

猜你在找的Android相关文章