Android,OpenGLES,CmdLine工具,获得MainDisplay解析

时间:2014-12-14 17:33:52

标签: android opengl-es android-ndk

环境

  • Windows(x64)主机
  • Android 5.0 USB连接到Windows机器
  • 三星Galaxy 5
  • VisualGDB
  • OpenGL(v1.4)
  • ADB CmdLine工具=> Native C ++(No Java)

用例

实现提取主显示分辨率的ADB命令行工具(这是工具功能的一部分)

以下代码打印乱码数据,如何使用作为ADB命令行工具运行的Native C ++代码获取主显示分辨率?

代码段

HRESULT GetMainDisplayResolution(OUT SIZE& sz) {
    EGLConfig pConfigs[MAX_CONFIGS] = { 0 };
    EGLint iErr = 0;
    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if (0 == display)
        return E_FAIL;
    int maj, min;
    if (FALSE == eglInitialize(display, &maj, &min)) {
        iErr = eglGetError();
        return E_FAIL;
    }

    EGLint iCfgCount = 0;
    if (FALSE == eglGetConfigs(display, pConfigs, MAX_CONFIGS, &iCfgCount)) {
        iErr = eglGetError();// EGL_NOT_INITIALIZED
        return E_FAIL;
    }

    for (int i = 0; i < iCfgCount; i++) {
        eglGetConfigAttrib(display, pConfigs[i], EGL_HORIZONTAL_RESOLUTION, (EGLint*)&sz.cx);
        eglGetConfigAttrib(display, pConfigs[i], EGL_VERTICAL_RESOLUTION, (EGLint*)&sz.cy);
        printf("Cfg %i, x:%i, y:%i", i, sz.cx, sz.cy);
    }

    return S_OK;
}

1 个答案:

答案 0 :(得分:1)

EGL无权访问显示器本身。它从Window Manager获取一个窗口,然后由SurfaceFlinger与其他东西合成。该架构描述为here

如果您不介意使用非公共API,并且您正在以“shell”或“root”(作为ADB命令,您将)运行,那么您可以执行某些测试代码所执行的操作并直接从SurfaceFlinger查询显示属性。看看WindowSurface。 (如果你想看到代码在运行,你可以在附近找到经典的“San Angeles”演示。)在Android 5.0“Lollipop”中添加了WindowSurface,取代了试图绕过SurfaceFlinger的旧实现(需要关闭Android框架) )。新的实现只是在正在运行的任何东西之上。

screenrecord工具使用相同的SurfaceComposerClient API来确定如何调整视频大小(see line 540)。如果你想要的只是分辨率并且实际上并不关心EGL,那么这是一个更简单的例子。