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

根据EGL_NATIVE_BUFFER_ANDROID docs:


ANativeWindowBuffer是 native 框架类(例如struct)使用的内部GraphicBuffer
不幸的是,由于我使用的是NDK,因此无法直接访问这些类。

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

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

我的问题是:如何将ANativeWindow_BuffereglCreateImageKHR()一起使用,或者如何从ANativeWindowBufferANativeWindow_Buffer获得ANativeWindow*

最佳答案

根据我在这条道路上发现的信息,ANativeWindow_BufferANativeWindowBuffer是完全不同的类型。好吧,它们有些相似,但是绝对不同,因此不能互换使用。

如果要比较,则定义如下:

  • 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

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

    因此,如果您找到了如何获取ANativeWindow_Buffer的方法,并希望自己顺利到达ANativeWindowBuffer的方法,那么您...可能就不行了。至少那是我的结论。我认为非常相似的名字只是一个 mock 。

    我没有找到从NDK代码创建ANativeWindowBuffer的方法。至少仅使用受支持的API,我相信这是不可能的。我的研究对象是KitKat。

    关于android - 从ANativeWindow_Buffer获取ANativeWindowBuffer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27525380/

    10-08 21:18