android ANativeWindow_lock api 不适用于 GLSurfaceView

标签 android opengl-es android-ndk java-native-interface glsurfaceview

我正在寻找从 Android GLSurfaceView 快速获取绘图缓冲区的方法。

尽管我知道 glreadpixel 可以完成这项工作,但 glreadpixel 获取绘图缓冲区的速度太慢。

我想读取保持 30 fps 的缓冲区。

ANativeWindow api 似乎是我正在寻找的..

ANativeWindow api performance

我找不到 GLSurfaceView 的 ANativeWindow api 的任何示例。

我的程序:

  1. 将 GLSurfaceView 表面发送到 jni 代码。(使用 GLSurfaceView.getHolder().getSurface())**
  2. 使用 ANativeWindow_fromSurface 方法获取窗口句柄。**
  3. 设置窗口缓冲区**
  4. 锁定表面并获取窗口缓冲区**
  5. 使用这个缓冲区做一些事情**
  6. 解锁并发布窗口**

我使用 Android“BasicGLSurfaceView”示例尝试了以下 jni 代码。

JNIEXPORT void JNICALL Java_com_example_android_basicglsurfaceview_BasicGLSurfaceViewActivity_readSurface(JNIEnv* jenv, jobject obj, jobject surface)
{

LOG_INFO("Java_com_example_android_basicglsurfaceview_BasicGLSurfaceViewActivity_readSurface");
if (surface != 0) {
    ANativeWindow *window = ANativeWindow_fromSurface(jenv, surface);
    LOG_INFO("Got window %p", window);
    if(window > 0)
    {
        int width = ANativeWindow_getWidth(window);
        int height = ANativeWindow_getHeight(window);

        LOG_INFO("Got window %d %d", width,height);

        ANativeWindow_setBuffersGeometry(window,0,0,WINDOW_FORMAT_RGBA_8888);

        ANativeWindow_Buffer buffer;
        memset((void*)&buffer,0,sizeof(buffer));

        int lockResult = -22;

            lockResult = ANativeWindow_lock(window, &buffer, NULL);
            if (lockResult == 0) {    \
              LOG_INFO("ANativeWindow_locked");
              ANativeWindow_unlockAndPost(window);
            }
            else
            {
                LOG_INFO("ANativeWindow_lock failed error %d",lockResult);
            }

        LOG_INFO("Releasing window");

        ANativeWindow_release(window);
    }


} else {
     LOG_INFO("surface is null");
}

return;

ANativeWindow_fromSurface 和 getHeight、setBuffersGeometry api 运行良好。

但是 ANativeWindow_lock api 总是无法返回 -22 值。

错误信息

[Surfaceview] 连接:已连接(cur=1,req=2)

我在渲染器或主线程或 onSurfaceChanged 的​​ onDrawFrame 上尝试了这段代码。

但总是返回 -22 值。

我在错误的地方调用这个 api?

是否可以对 GLSurfaceView 使用 ANativeWindow_lock?

Here is my example code

任何帮助将不胜感激~

最佳答案

尝试这样做:

http://forums.arm.com/index.php?/topic/15782-glreadpixels/

希望您可以为缓冲区使用 ANativeWindow,这样您就不必直接调用 gralloc...

关于android ANativeWindow_lock api 不适用于 GLSurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080745/

相关文章:

android - 使用 FFMPEG 调整视频帧大小

android - 将编辑文本下划线颜色更改为在关闭焦点和焦点时相同

android - 两个 native 移动应用程序共享相同的 Azure AD B2C(配置)

android - 使用 Monodroid 的 OpenGL 2.0 绘图(使用 OpenTK)

android - 配置 Qt Creator 以将 Clang 与 Qt for Android 结合使用

android - ARM Neon Assembler - 奇怪的管道问题

android - 图像不适合圆形 ImageView

math - 在旋转过程中放大图像以看不到边缘的量的公式是什么

iphone - Open GL 是 2d 纸牌游戏的矫枉过正吗?

java - Android Studio 构建 NDK {NDK_PROJECT_PATH=null} 错误 87 => 错误 1