Android、OpenGLES、CmdLine工具、获取主显示分辨率 环境 Windows(x64)主机 Android 5.0 USB连接到Windows计算机 三星Galaxy 5 视觉GDB OpenGL(v1.4) ADBCMDLeNoToRe=:本机C++(无java)< /LI> 用例

Android、OpenGLES、CmdLine工具、获取主显示分辨率 环境 Windows(x64)主机 Android 5.0 USB连接到Windows计算机 三星Galaxy 5 视觉GDB OpenGL(v1.4) ADBCMDLeNoToRe=:本机C++(无java)< /LI> 用例,android,opengl-es,android-ndk,Android,Opengl Es,Android Ndk,实现提取主显示分辨率的ADB命令行工具(这是工具功能的一部分) >下面的代码打印乱码数据,如何使用原生C++代码作为ADB命令行工具来获取主显示分辨率?< /P> 代码片段 HRESULT GetMainDisplayResolution(输出大小和深浅){ EGLConfig pConfigs[MAX_CONFIGS]={0}; EGLint-iErr=0; EGLDisplay display=eglGetDisplay(EGL_默认显示); 如果(0==显示) 返回E_失败; int m

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

<> >下面的代码<强>打印乱码数据<强>,如何使用原生C++代码作为ADB命令行工具来获取主显示分辨率?< /P> 代码片段
HRESULT GetMainDisplayResolution(输出大小和深浅){
EGLConfig pConfigs[MAX_CONFIGS]={0};
EGLint-iErr=0;
EGLDisplay display=eglGetDisplay(EGL_默认显示);
如果(0==显示)
返回E_失败;
int maj,min;
if(FALSE==eglInitialize(显示、&maj、&min)){
iErr=eglGetError();
返回E_失败;
}
EGLint iCfgCount=0;
if(FALSE==eglGetConfigs(显示、pConfigs、最大配置和iCfgCount)){
iErr=eglGetError();//EGL\u未初始化
返回E_失败;
}
对于(int i=0;i
EGL无法访问显示器本身。它从窗口管理器中获取一个窗口,然后由SurfaceFlinger将其与其他内容合成。描述了该体系结构

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


screenrecord
工具使用相同的SurfaceComposerClient API来确定视频大小()。如果您想要的只是解决方案,而实际上并不关心EGL,那么这是一个更简单的示例。

当我使用带有我的解决方案的~patched~ screenrecorder版本时,为了最大限度地减少操作系统更新时的维护工作,我希望尽可能避免使用未记录的API,我想知道,是否可以使用Java实现ADB工具,然后使用常规API获得eg.分辨率?公共API等效于
android.view.Display
类。您可以在Grafika()中看到它用于获取主显示器的刷新率。棘手的是“从亚洲开发银行启动”部分。您需要针对框架libs进行链接,并且可能需要处理app_进程和zygote通常处理的一些设置。我自己没试过这么做。不确定这是不是一个精确的复制品,但请看。
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;
}