需求
在使用 ndk 做 Android 开发时,一件比较麻烦的事情是编译脚本 (也就是 Android.mk 和 Application.mk ) 的维护工作。今天尝试了一下把这个维护的工作自动化,完成以后简单记录一下。
在日常工作里我尝试过不少生成脚本的自动化工具,用下来觉得最方便的是 Premake,这个工具的好处是 Lua 语法,跟 cmake 之类的脚本相比,非常清晰易读。我用 C++ 写的库,大多是用这个工具生成工程文件 (sln/vcxproj) 的,这样的生成两大好处:
- 可以使工程文件与磁盘上的目录结构自动对应。
- 所有的编译选项清楚地列在一个简短的 Lua 内,维护时不容易出错。
这一次我的目标就是使用 Premake 把 Android.mk 和 Application.mk 这两个脚本的维护自动化,最好能做到一键生成 vs2013/android 两个平台对应的编译脚本。
Make it run
从这个页面可以看到,Premake 没有原生对 android ndk 的支持,但在 Third-Party Modules 里可以看到两个相关的包,一个是 TurkeyMan(Manu Evans) 的 premake-android,另一个是 Meoo(Bastien Brunnenstein) 的 premake-androidmk,这一次我们使用后者。
阅读 Premake 的文档 Using Modules 可以知道,使用第三方模块本质上就是一个普通的 require,我们 git clone 到本地后,按照 README 这样照葫芦画瓢写个例子测试一下吧。
写完以后发现,作者在 readme 里没有写具体用什么命令来执行……翻代码之后发现正确姿势是这样的:
|
|
运行后—— duang~~ 得到一个 Lua 报错,大致是说几个期望的表为 nil,翻代码看了一下,是几个实际上无需指定的 optional 参数,作者提供的例子里也没有指定。那么把代码 fork 到本地修一下吧。 (这里) 是对应的修复 commit。
再次运行就一切正常了。
注意事项
需要注意以下事项,
-
生成脚本 (此处为 premake_android.lua) 内所有的路径为相对于生成脚本的路径,而非相对于 Android.mk 的路径,Premake 会完成路径的转换
-
为了生成恰当的 LOCAL_MODULE_FILENAME,需要在 project 内指明 targetname
- 以下三个选项是最常用到的选项,分别是 Android.mk 的生成路径,abi 选择和 sdk 版本号的选择
- 实际的 include $(BUILD_STATIC_LIBRARY) 在配置项 $(PM5_CONFIG) 对应的条件分支内,编译时需要指明这个配置项的值 (如下图中的情况需要在编译时指明
ndk-build PM5_CONFIG=debug
,或在引用脚本里指明是使用 debug 还是 release )
代码清单
这里是全部的脚本清单,可以看到与同类型的工具相比,非常简洁和易于维护:
|
|
使用以下的命令一键生成 vs2013/android 的工程文件和编译脚本:
|
|
我的修复版 premake-androidmk 在这里维护。
(全文完)