升级到4.3后的ScreenshotClient错误

时间:2013-09-02 14:10:28

标签: android android-ndk android-source android-4.3-jelly-bean

我开发了一个原生流程,使用ScreenshotClient来捕获设备屏幕(仅限root设备) 我有一个循环,其ScreenshotClient每个周期都update()。一切顺利,直到4.3。 当我在4.3上运行它时,第一次调用更新成功,但在第二次调用时调用结果是-2,我在logcat中得到这些错误:

E/BufferQueue( 8166): [ScreenshotClient] connect: already connected (cur=1,req=1)
E/libEGL ( 2463): EGLNativeWindowType 0x4116d5f8 already connected to another API
E/libEGL ( 2463): eglCreateWindowSurface:376 error 300b (EGL_BAD_NATIVE_WINDOW)
E/SurfaceFlinger( 2463): captureScreenImplLocked: eglCreateWindowSurface() failed 0x300b

知道4.3中导致这种情况发生了什么,或者这些错误意味着什么。

我的代码大致如下:

int main(int argc, char** argv) {

    ProcessState::self()->startThreadPool();

    sp < IBinder > display = SurfaceComposerClient::getBuiltInDisplay(
            DEFAULT_DISPLAY_ID);

    ScreenshotClient client;
    while (true) {
        client.update(display);
        pixels = screenshot.getPixels();
        // do something with the data
    }
}

1 个答案:

答案 0 :(得分:2)

我们的产品遇到了类似的问题,我们能够通过使用标题的更新版本来部分解决这个问题(它现在适用于Galaxy Nexus,但仍然存在4.3版其他Nexus设备的问题)

例如:frameworks / native / include / gui / SurfaceComposerClient.h

自4.2以来,这已经发生了变化,因此需要为4.3再次重新编译可执行文件。

我仍然试图理解为什么这对N4和N7不起作用,但至少能够在我的GN上取得进展。

希望这有帮助。

编辑:在进一步检查时,这看起来像SurfaceFlinger界面中的一个错误,用于执行屏幕捕获。 SurfaceComposerClient在内部调用SurfaceFlinger并尝试抓取屏幕。在4.3版本的SurfaceFlinger中,有两种方法可以进行屏幕捕获。一个用于现代设备,如N4 / N7(使用某种优化的GL-> CPU路径来抓取帧)和传统版本(内部使用一种名为'glReadPixels'的方法,它使用更昂贵的CPU-&gt; CPU用于Galaxy Nexus等设备的抓取屏幕的路线。

现在在优化的代码路径上,调用了一个方法native_window_api_connect,这是第二次调用update()时失败的方法。这是因为之前的更新调用也调用了此函数并获得了从未发布的本机窗口的连接。它应该通过调用native_window_api_disconnect来释放,这种情况从未发生过。

但是在未经优化的代码路径中,会发生连接和随后断开连接的调用,因此一切运行良好(假设您已经使用4.3头文件构建了本机模块)。

: - )