网站首页 > 技术文章 正文
对于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-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)