在使用 ndk 做 Android 开发时,一件比较麻烦的事情是编译脚本 (也就是 Android.mk 和 Application.mk ) 的维护工作。今天尝试了一下把这个维护的工作自动化,完成以后简单记录一下。
在日常工作里我尝试过不少生成脚本的自动化工具,用下来觉得最方便的是 Premake ,这个工具的好处是 Lua 语法,跟 cmake 之类的脚本相比,非常清晰易读。我用 C++ 写的库,大多是用这个工具生成工程文件 (sln/vcxproj) 的,这样的生成两大好处:
这一次我的目标就是使用 Premake 把 Android.mk 和 Application.mk 这两个脚本的维护自动化,最好能做到一键生成 vs2013/vs2015/android 三个平台的编译脚本。
从 这个页面 可以看到,Premake 没有原生对 android ndk 的支持,但在 Third-Party Modules 里可以看到两个相关的包,一个是 TurkeyMan(Manu Evans) 的 premake-android ,另一个是 Meoo(Bastien Brunnenstein) 的 premake-androidmk ,这一次我们使用后者。
阅读 Premake 的文档 Using Modules 可以知道,使用第三方模块本质上就是一个普通的 require,我们把 git clone 到本地后,按照 README 这样照葫芦画瓢写一个例子测试一下吧。
写完以后发现,作者在 readme 里没有写具体用什么命令来执行……翻代码之后发现正确姿势是这样的:
premake5.exe --file=premake_android.lua androidmk
运行后—— duang~~ 得到一个 Lua 报错,大致是说几个期望的表为 nil,翻代码看了一下,是几个实际上无需指定的 optional 参数,作者提供的例子里也没有指定。那么把代码 fork 到本地修一下吧。 ( 这里 ) 是对应的修复 commit。
再次运行就一切正常了。
需要注意以下事项,
生成脚本 (此处为 premake_android.lua) 内所有的路径为相对于生成脚本的路径,而非相对于 Android.mk 的路径,Premake 会完成路径的转换
为了生成恰当的 LOCAL_MODULE_FILENAME,需要在 project 内指明 targetname
ndk-build PM5_CONFIG=debug
,或在引用脚本里指明是使用 debug 还是 release )
这里是全部的脚本清单,可以看到与同类型的工具相比,非常简洁和易于维护:
require "modules/premake-androidmk/androidmk" solution "mici" configurations { "Debug", "Release" } language "C++" location "android/jni" ndkabi "default" ndkplatform "android-19" filter "configurations:Release" optimize "On" filter "configurations:Debug" optimize "Debug" project "mici_static" targetname "libmici" kind "StaticLib" includedirs "../" files { "../mici/**", }
使用以下的命令一键生成 vs2013/android 的工程文件和编译脚本:
premake5.exe --file=premake_vs2013.lua vs2013 premake5.exe --file=premake_android.lua androidmk
我的修复版 premake-androidmk 在 这里 维护。
[完]
Gu Lu
[2016-04-17]