Android NDK 编译脚本分析 之一Word格式文档下载.docx
《Android NDK 编译脚本分析 之一Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Android NDK 编译脚本分析 之一Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。
AndroidNDK的编译脚本系统,实际上并不是什么新东西,就是对GNUMakeFile系统的封装。
AndroidNDK自带了很多.mk文件(保存在ndk的NDK_ROOT/build目录中),文件中预定义了很多Make脚本函数和变量,以供用户编写自己的编译脚本时使用。
另外,NDK为所有应用统一提供了一个固定的编译入口--即大家熟悉的ndk-build。
我们首先从每个应用编译时都需要用到的编译入口开始分析。
一、ndk-build分析
(一)、脚本内容分析
该文件存在于ndk安装根目录中,实际上是一个shell脚本。
其有效内容如下:
PROGDIR=`dirname$0`
PROGDIR=`cd$PROGDIR&
amp;
&
pwd`#IfGNUMAKEisdefined,checkthatitpointstoavalidfile
if[-n"
$GNUMAKE"
];
then
ABS_GNUMAKE=`which$GNUMAKE2&
gt;
/dev/null`
if[$?
!
=0];
echo"
ERROR:
YourGNUMAKEvariableisdefinedtoaninvalidname:
$GNUMAKE"
Pleasefixittopointtoavalidmakeexecutable(e.g./usr/bin/make)"
exit1
fi
GNUMAKE="
$ABS_GNUMAKE"
else
#Otherwise,use'
make'
andcheckthatitisavailable
GNUMAKE=`whichmake2&
Cannotfind'
program.PleaseinstallCygwinmakepackage"
ordefinetheGNUMAKEvariabletopointtoit."
fi#OnWindows,whenrunningundercygwin,checkthatweare
#invokingacygwin-compatibleGNUMakebinary.Itisunfortunately
#commonforappdeveloperstohaveanothernon-cygwincompatible
#
if["
$OSTYPE"
="
cygwin"
GNUMAKE=`cygpath-u$GNUMAKE`
PROGDIR_MIXED=`cygpath-m$PROGDIR`
CYGWIN_GNUMAKE=`$GNUMAKE-f$PROGDIR_MIXED/build/core/check-cygwin-make.mk2&
1`
Youareusinganon-CygwincompatibleMakeprogram."
Currentlyusing:
`cygpath-m$GNUMAKE`"
"
Tosolvetheissue,followthesesteps:
1.EnsurethattheCygwin'
packageisinstalled."
NOTE:
YouwillneedGNUMake3.81orlater!
2.DefinetheGNUMAKEenvironmentvariabletopointtoit,asin:
exportGNUMAKE=/usr/bin/make"
3.Call'
ndk-build'
again."
fi$GNUMAKE-f$PROGDIR/build/core/build-local.mk"
$@"
下面我们对这些有效代码逐一进行分析:
pwd`在GNUmakefile中,两个反引号相当于shell函数,反引号括起来的内容相当于shell函数的参数。
而shell函数的功能就是调用操作系统的命令。
linux命令dirname,功能是获取后面参数的路径。
例如:
#dirname../../../ndk-build执行的结果是:
../../.."
。
顺便提一下,这里不能用pwd命令,pwd命令,是获得当前路径,获取的是当前路径的绝对路径。
所以,上面两条语句的结果就是在PROGDIR变量中保存ndk-build所在的路径。
有了这两条语句之后,就可以在任何位置执行ndk-build,而不必非要在ndk根目录中执行。
再之后的两段语句,是用来确定不同平台下正确的make工具。
#IfGNUMAKEisdefined,checkthatitpointstoavalidfile
fi最后一条语句,是调用:
$GNUMAKE-f$PROGDIR/build/core/build-local.mk"
这是真正开始执行make,指定Makefile为build-local.mk文件。
同时,将ndk-build的所有参数($@)原封不动地都传递进去。
总之ndk-build是对make指令的封装,并不对各个参数作处理,具体参数原封不动地传给make和Makefile。
由此可见,ndk-build,只是对make命令的一个封装,为编译提供一个统一的且适应性更强的编译入口。
(二)、技巧
二、build-local.mk文件分析=======================================================================================================================
一、Android.mk文件内容分析
典型的Android.mk文件一般会包含如下内容:
L