【问题标题】:How can I create a new NativeWindow in Android NDK without needing the Android OS source code?如何在不需要 Android OS 源代码的情况下在 Android NDK 中创建新的 NativeWindow?
【发布时间】:2014-02-12 08:40:12
【问题描述】:

我想编译一个 Android OpenGL 控制台应用程序,您可以直接从控制台启动 Android x86 或从 Android x86 GUI 中的 Android 终端应用程序运行它。

这篇文章 (How can I create a new NativeWindow in Android NDK?) 提出了类似的问题。但是,答案说要下载并构建整个android源代码,因为这里的测试(https://android.googlesource.com/platform/frameworks/base/+/refs/heads/gingerbread-release/opengl/tests)例如(https://android.googlesource.com/platform/frameworks/base/+/refs/heads/gingerbread-release/opengl/tests/gl_basic/gl_basic.cpp)具有诸如“#include”之类的依赖项

我想用 NDK 构建理想的应用程序,但如有必要,我可以在 Ubuntu 上构建它。

gl_basic.cpp 会很棒,除了我不想为了构建这么小的程序而下载和构建整个 Android 源代码(gl_basic.cpp 只有 364 行代码!)

我尝试使用 ndk-build.cmd 构建 gl_basic.cpp,但我得到 FramebufferNativeWindow.h not found... 然后,如果我继续将更多头文件下载到本地项目,我最终会遇到链接错误。我想知道是否有更简单的方法来使用 NDK 构建诸如 gl_basic.cpp(带有 main() 函数的 Android OpenGL 可执行文件)之类的东西。

PS 我知道编写 Android 应用程序的常规方法是创建一个 APK,但我不想这样做 - 我想要一个可以从 Android 运行的带有 main() 和 OpenGL 的独立 Linux 可执行文件在 Android 内部运行的终端仿真器应用程序...在基于 x86 的 Android(不是 ARM)上。

另外让我补充一点,我知道您可以将“include $(BUILD_EXECUTABLE)”放在 Android.mk 文件中,将“APP_ABI := x86”放在 Application.mk 文件中。我使用 ndk-build.cmd 构建 Android 可执行文件没有问题,该可执行文件从 x86 Android 上的 Android Terminal Emulator 运行并使用 printf() 打印“hello world”。

我遇到的问题是使用 OpenGL 创建这样的可执行文件。我认为部分魔法是 FramebufferNativeWindow.h,但它也有自己的包含...我想知道我是否可以使用 ndk-build.cmd 构建类似于 gl_basic.cpp 的东西(甚至在 Ubuntu 上使用 make 和 gcc ) 将在 Android Terminal Emulator 中运行...但我不想下载和构建整个 Android 源代码树。

总结:如何创建带有 NDK 中包含的标头和库的本机窗口?我知道可以通过从 libui 调用 android_createDisplaySurface() 来完成。但是,libui 不包含在 NDK 中。那么如何使用纯 C++(无 Java)代码从 NDK 创建本机窗口(供 EGL 和 OpenGL 使用)? eglCreateWindowSurface() 的第三个参数是 NativeWindowType,所以我需要以某种方式创建一个 NativeWindow。

总结:我的最终目标是编写一个带有绘制 OpenGL 三角形的 main() 函数的 C++ 可执行文件,我可以在 Android x86 控制台模式下运行它。没有 Java。

【问题讨论】:

    标签: android c++ opengl-es android-ndk


    【解决方案1】:

    必须下载所有必要的#includes;链接可执行文件时,您需要缺少的系统库来解析引用。您不需要重新构建这些库,您可以在目标设备中找到现成的库,甚至可以从仿真器映像中找到。 /system/lib目录下的系统库可以通过adb pull命令轻松获取。

    请注意,链接器不需要解析所有引用:即对于命令

    ln A.o libB.a -lC -lD -o E
    

    您只需要 libD.so 来匹配对象 Ao 中的符号以及 libB.a 中的所有引用对象,但不需要libC.so 的依赖项。

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2013-10-02
      • 2015-01-21
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多