网站首页 > 博客文章 正文
对于Android版本来说,原先仍然使用的是NDK的那套东西,所以在维护上带来了不小的开销。
随着代码量越来越大,如果能把Android也纳入到CMake工程中,开发起来就能更方便
原有的编译方法
纯用命令行的方式进行编译。需要:
- 准备好AndroidManifest.xml、Android.mk、 Application.mk等工程文件
- android update project -p . -s –target=android-10,生成build.xml等
- ndk-build,编译出.so
- 把所需资源编译和拷贝到assets目录
- ant debug,打包成apk
- adb install bin/xxx-debug.apk,把apk安装到Android
一般把2-6放在一个脚本里,直接执行那个脚本就能完成这一系列动作。这么做就需要手工对每个工程写AndroidManifest.xml、Android.mk、 Application.mk等,费时费力。而且其中大部分与CMake里的内容重复。
另外,使用NDK的工程还有一系列的限制,比如lib的目录结构、module的位置等。都是技术上没必要的人为限制。
新的编译方法
android-cmake
现在的NDK提供了make-standalone-toolchain.sh,本质上就能把编译工具链当作一个独立的gcc编译系统使用。这给连 到CMake提供了可能。CMake本身是可以通过命令行参数来指定使用非默认的编译器。不过如果那么做的话,就需要指定相当多的参数,会非常的繁复。好 在有了android-cmake这 个神器。android-cmake的目标正是让CMake能与Android开发结合起来。其中最关键的就是提供了一个叫 android.toolchain.cmake的文件。它可以简单地通过cmake -DCMAKE_TOOLCHAIN_FILE=path/to/android.toolchain.cmake这样的形式,一次设定所有CMake所 需的路径、编译器名、链接器名等信息。其他参数都和原先使用CMake的时候无区别。
需要注意的是,googlecode上的android-cmake已经不更新了,作者搬到了github上,但原网站并没有注明。这个配置文件也被用到了OpenCV中。所以从OpenCV的source tree里也能下载到。
交叉编译
android-cmake的使用只是迈出了第一步,要完全切换到CMake,还需要一些额外工作。首先遇到的问题是,以前KlayGE的 python编译脚本和CMakeLists.txt都只考虑了同平台编译,没有考虑交叉编译的情况。而编译到Android很显然是个交叉编译的过程。 所以py和CMakeLists里都需要做相应的修改,把host platform和target platform分开。并针对不同情况做独立判断。原先gcc的分支就已经是完备的,所以只需要加为数不多的几处判断即可。经过这些修改,.a和.so可 以顺利生成,也就是替换了前面的第三步。这下彻底不需要ndk-build、Android.mk和Application.mk了。把工程文件统一到了 同样的CMakeLists.txt里。NDK带来的限制也都不存在了。
这里有个坑在于whole-archive。原先使用Android.mk的时候可以直接指定一些库是通过whole-archive的方式进行链 接,而其他库是普通的方式。对于循环以来的情况,需要用whole-archive来解决。在CMake里,这里就只有一个 TARGET_LINK_LIBRARIES了,无法区分。插了一些网站后,发现了一个解决方法,用-Wl,–whole-archive a b c -Wl,–no-whole-archive d e f这样的方式,就能指定哪些库用whole-archive,哪些不用。
更进一步
对于AndroidManifest.xml和res/values/strings.xml这样的文件,虽然每个工程都不同,但内容大同小异。所 以只要写个.in,然后同CMake的CONFIGURE_FILE生成工程所需的文件即可。对于资源的编译和拷贝,可以把资源的文件写到一个独立分组 CONTENT_FILES里。在PRE_BUILD的时候扫一遍CONTENT_FILES,把需要编译的编译了,都拷贝到assets里。所以,步骤 1,3,4都被CMake取代了。对于其他几个步骤,也可以用ADD_CUSTOM_COMMAND,加到PRE_BUILD和POST_BUILD。这 么一来,整个编译过程都放到了CMake中,不再需要直接接触Android的NDK和SDK。
总结
至此,CMake已经可以完全取代原先NDK的方法。只需要管理CMakeLists.txt,就能兼顾Windows、Linux、Android三个平台的编译。而且整个过程都可以使用公开的工具完成,不需要对CMake做额外修改,很方便。
。
猜你喜欢
- 2024-10-03 Qt4/5升级到Qt6吐血经验总结V202308
- 2024-10-03 微软兑现承诺:更新Linux子系统,编译WSL 2内核只需3步
- 2024-10-03 centos7使用源码从python2升级到python3,干货值得收藏
- 2024-10-03 Clion2021大版本更新亮点一览(clion2020.1)
- 2024-10-03 CPack 入门指南(cpaks)
- 2024-10-03 C/C++ 开发工具 CLion 新版发布,10 大新功能抢先看
- 2024-10-03 centos7升级glibc(centos7升级gcc)
- 2024-10-03 ReactOS年度报告:改进shell,增强应用管理
- 2024-10-03 CMake构建Makefile深度解析:从底层原理到复杂项目
- 2024-10-03 CBrother升级至V2.5.5,支持编译和打包
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)