如何在不需要Android OS源代码的情况下在Android NDK中创建新的NativeWindow?

时间:2014-01-22 10:33:13

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

我想编译一个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 ...然后如果我继续向我的本地项目下载更多头文件,我最终会遇到链接错误。我想知道是否有一种更简单的方法可以使用NDK构建类似gl_basic.cpp(带有main()函数的Android OpenGL可执行文件)。

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

另外请允许我补充一点,我知道您可以在Android.mk文件中添加“include $(BUILD_EXECUTABLE)”,在Application.mk文件中添加“APP_ABI:= x86”。使用ndk-build.cmd构建Android可执行文件没有问题,该可执行文件在x86 Android上从Android终端模拟器运行,并使用printf()打印“hello world”。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

您只需要 libD.so 来匹配来自 libB.a 的对象 Ao 中的符号和所有引用的对象,但不能用于 libC.so 的依赖关系。