【问题标题】:Android, OpenGLES, CmdLine tool, getting MainDisplay resolutionAndroid、OpenGLES、CmdLine工具,获取MainDisplay分辨率
【发布时间】:2014-12-14 17:33:51
【问题描述】:

环境

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

用例

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

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

代码 sn-p

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;
}

【问题讨论】:

标签: android opengl-es android-ndk


【解决方案1】:

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

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

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

【讨论】:

  • 当我使用带有我的解决方案的 ~patched~ screenrecorder 版本时,为了最大限度地减少操作系统更新时的维护工作,我想尽可能避免未记录的 API,我想知道,可能可以使用 Java 实现 ADB 工具,然后获取例如。使用传统 API 解决问题?
  • 公共 API 等价物是 android.view.Display 类。您可以在 Grafika (github.com/google/grafika/blob/master/src/com/android/grafika/…) 中看到它用于获取主显示器的刷新率。棘手的一点是“从亚行启动”部分。您需要链接框架库,并且可能必须处理 app_process 和 zygote 通常处理的一些设置。我自己没有尝试过这样做。
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多