仅使用CMake和MinGW构建C++语言Android应用的可行方法咨询
纯CMake+Eclipse构建Android C++游戏引擎应用教程
前置准备
- Android NDK(r15及以上版本,原生支持CMake构建链)
- Android SDK Build Tools、对应适配版本的Android Platform SDK
- Eclipse 4.6+ 版本,提前安装CDT插件、CMake Editor插件
- 自研C++游戏引擎完整源码
核心构建流程(完全不依赖Gradle/Ant/Android Studio)
第一步:编写根目录CMakeLists.txt
优先使用NDK官方提供的Android工具链文件,不要调用系统默认CMake工具链,基础配置示例如下:
cmake_minimum_required(VERSION 3.22.1) # 引入NDK自带的Android工具链 set(CMAKE_TOOLCHAIN_FILE "$ENV{NDK_PATH}/build/cmake/android.toolchain.cmake" CACHE PATH "Android NDK toolchain path") # 配置Android构建参数 set(ANDROID_ABI arm64-v8a CACHE STRING "Target ABI") set(ANDROID_PLATFORM android-27 CACHE STRING "Minimum supported Android version") set(ANDROID_STL c++_shared CACHE STRING "STL runtime to use") project(MyGameEngineAndroid LANGUAGES C CXX) # 编译游戏引擎为动态库 add_library(game_engine SHARED # 此处替换为自研引擎所有C/C++源文件路径 src/core/engine.cpp src/render/gles_renderer.cpp src/platform/android/android_wrapper.cpp ) # 链接Android平台依赖系统库 target_link_libraries(game_engine GLESv3 EGL android log )
第二步:准备Android应用基础结构
手动创建标准Android项目目录即可,不需要生成Gradle/Ant配置文件:
- 项目根目录下新建
android_root文件夹,内部结构如下:AndroidManifest.xml:配置应用包名、权限、Activity、版本信息res/:存放应用图标、字符串、布局等资源文件libs/:按ABI分子目录存放编译产出的动态库assets/:存放游戏资源包、配置文件等不需要编译的资源
Native Activity类型应用的Manifest参考示例:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yourcompany.gametest" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="33" /> <uses-feature android:glEsVersion="0x00030000" android:required="true" /> <application android:label="MyGame" android:icon="@mipmap/ic_launcher"> <activity android:name="android.app.NativeActivity" android:exported="true"> <meta-data android:name="android.app.lib_name" android:value="game_engine" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
第三步:配置CMake自定义命令完成APK打包
直接在CMakeLists中添加自定义构建目标,调用SDK自带的aapt2、zipalign、apksigner工具完成全流程打包,不需要依赖其他构建工具:
# 配置SDK路径、签名信息等参数 set(ANDROID_SDK_PATH "$ENV{ANDROID_SDK_PATH}" CACHE PATH "Android SDK root path") set(KEYSTORE_PATH "$ENV{KEYSTORE_PATH}" CACHE PATH "Signing keystore path") set(KEYSTORE_PASS "$ENV{KEYSTORE_PASS}" CACHE STRING "Keystore password") # 自定义目标:构建最终签名APK add_custom_target(build_apk ALL # 1. 编译资源文件 COMMAND ${ANDROID_SDK_PATH}/build-tools/34.0.0/aapt2 compile --dir android_root/res -o compiled_resources.zip # 2. 链接资源生成未签名APK COMMAND ${ANDROID_SDK_PATH}/build-tools/34.0.0/aapt2 link compiled_resources.zip -I ${ANDROID_SDK_PATH}/platforms/android-33/android.jar --manifest android_root/AndroidManifest.xml -o unsigned.apk --auto-add-overlay # 3. 把编译好的动态库添加到APK包中 COMMAND zip -uj unsigned.apk lib/${ANDROID_ABI}/libgame_engine.so COMMAND zip -uj unsigned.apk ${ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libs/${ANDROID_ABI}/libc++_shared.so # 4. 对齐APK COMMAND ${ANDROID_SDK_PATH}/build-tools/34.0.0/zipalign -v 4 unsigned.apk aligned.apk # 5. 签名APK COMMAND ${ANDROID_SDK_PATH}/build-tools/34.0.0/apksigner sign --ks ${KEYSTORE_PATH} --ks-pass pass:${KEYSTORE_PASS} --out final_game.apk aligned.apk DEPENDS game_engine WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )
第四步:Eclipse配置
- 打开Eclipse,选择导入
Existing Code as Makefile Project,选中项目根目录,工具链选择Android GCC,无对应选项可以手动将CDT构建器配置为CMake - 进入项目属性->C/C++ Build->Environment,添加
NDK_PATH、ANDROID_SDK_PATH、KEYSTORE_PATH、KEYSTORE_PASS四个环境变量,填写本地对应路径和密码 - 将默认构建命令替换为
cmake --build . --target build_apk,点击Eclipse构建按钮即可直接生成最终签名APK - 新增
Android Application运行配置,选择打包好的final_game.apk,连接真机或启动模拟器后点击运行即可直接安装启动应用
注意事项
- 如果需要自定义Java层逻辑,只需要在CMake自定义命令中增加
javac编译Java代码、d8转dex的步骤即可,流程和上述打包逻辑一致 - 多ABI构建可以通过创建多个CMake构建目录,每个目录配置不同
ANDROID_ABI参数实现,不需要修改核心CMakeLists逻辑
内容的提问来源于stack exchange,提问作者guacamoleku
相关产品推荐
相关产品推荐

