android - 从 ANativeWindow_Buffer 获取 ANativeWindowBuffer

标签 android c++ android-ndk java-native-interface egl

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

根据 EGL_NATIVE_BUFFER_ANDROID docs :

This extension enables using an Android window buffer (struct ANativeWindowBuffer) as an EGLImage 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_BuffereglCreateImageKHR()或者如何获得 ANativeWindowBuffer来自 ANativeWindow_Buffer或来自 ANativeWindow* .

最佳答案

根据我在走这条路时发现的情况,ANativeWindow_BufferANativeWindowBuffer 是完全不同的类型。嗯,它们有些相似,但绝对不同,不能互换使用。

如果要比较,这里是定义:

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

因此,如果您发现了如何获得 ANativeWindow_Buffer,并且希望您能顺利获得 ANativeWindowBuffer,那么您...可能不是.至少那是我的结论。我认为非常相似的名字只是一种戏弄。

我没有找到从 NDK 代码创建 ANativeWindowBuffer 的方法。至少在仅使用受支持的 API 的情况下,我认为这是不可能的。我的研究是关于 KitKat。

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

相关文章:

android - 运行编译文件问题 - eh_frame_hdr

android - 如何从 Android 应用调用 OpenSSL SRP API?

Android 动画方法和可见性 GONE

java - Android 在内部类中动态更改按钮背景

内置 ListView 的 Android CardView - CardView 上的 onTouchListener 无法正常工作

c++ - constexpr 类模板文字类型可以在非文字类型上参数化吗?

android - 当一个或多个可见性设置为 GONE 时,在 RelativeLayout 中垂直居中 TextView

c++ - C++ 类中的函数调用

c++ - 从保存在字符串 vector C++ 中的文本文件中检查单词序列

android - 我如何告诉 Android Studio 将 GCC 4.9 与 CMake 一起使用?