Android NDK 编译脚本分析 之一.docx
- 文档编号:3241948
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:6
- 大小:17.22KB
Android NDK 编译脚本分析 之一.docx
《Android NDK 编译脚本分析 之一.docx》由会员分享,可在线阅读,更多相关《Android NDK 编译脚本分析 之一.docx(6页珍藏版)》请在冰豆网上搜索。
AndroidNDK编译脚本分析之一
AndroidNDK编译脚本分析之一
版权信息:
本文为本人原创,欢迎转载,但请著明出处,并保留本版权信息。
AndroidNDK编译脚本编写起来还是是比较简单条理的,然而它的语法和传统的linuxGNUMake编译脚本的编写似乎有很大的不同,这让习惯了GNUMakefile的用户很不习惯。
有许多人会用它,但对其工作原理却不理解,笔者甚至一度误认为那是一套全新脚本语言。
我将在后文中对这一编译管理系统做一些分析,试着分析一下它和传统GNUMakefile的关系。
本文假设您已经拥有Linux命令和GNUMakefile的基础知识,当然您也可以边阅读,边查找参考相关的知识。
参考资料2是徐海兵先生整理的GNUMakefile中文手册,推荐英文不太好的朋友拿来作为参考。
这篇文章是对自己前段时间所学知识的一个记录整理,以期与大家互相交流,希望朋友们不要吝于来信,指出本文的错漏之处或者你们不同理解(绝非客气,真的期望能收到您的信件,我的邮箱techres#,请把#换成@)。
====================================================================
AndroidNDK的编译脚本系统,实际上并不是什么新东西,就是对GNUMakeFile系统的封装。
AndroidNDK自带了很多.mk文件(保存在ndk的NDK_ROOT/build目录中),文件中预定义了很多Make脚本函数和变量,以供用户编写自己的编译脚本时使用。
另外,NDK为所有应用统一提供了一个固定的编译入口--即大家熟悉的ndk-build。
我们首先从每个应用编译时都需要用到的编译入口开始分析。
一、ndk-build分析
(一)、脚本内容分析
该文件存在于ndk安装根目录中,实际上是一个shell脚本。
其有效内容如下:
PROGDIR=`dirname$0`
PROGDIR=`cd$PROGDIR&&pwd`#IfGNUMAKEisdefined,checkthatitpointstoavalidfile
if[-n"$GNUMAKE"];then
ABS_GNUMAKE=`which$GNUMAKE2>/dev/null`
if[$?
!
=0];then
echo"ERROR:
YourGNUMAKEvariableisdefinedtoaninvalidname:
$GNUMAKE"
echo"Pleasefixittopointtoavalidmakeexecutable(e.g./usr/bin/make)"
exit1
fi
GNUMAKE="$ABS_GNUMAKE"
else
#Otherwise,use'make'andcheckthatitisavailable
GNUMAKE=`whichmake2>/dev/null`
if[$?
!
=0];then
echo"ERROR:
Cannotfind'make'program.PleaseinstallCygwinmakepackage"
echo"ordefinetheGNUMAKEvariabletopointtoit."
exit1
fi
fi#OnWindows,whenrunningundercygwin,checkthatweare
#invokingacygwin-compatibleGNUMakebinary.Itisunfortunately
#commonforappdeveloperstohaveanothernon-cygwincompatible
#
if["$OSTYPE"="cygwin"];then
GNUMAKE=`cygpath-u$GNUMAKE`
PROGDIR_MIXED=`cygpath-m$PROGDIR`
CYGWIN_GNUMAKE=`$GNUMAKE-f$PROGDIR_MIXED/build/core/check-cygwin-make.mk2>&1`
if[$?
!
=0];then
echo"ERROR:
Youareusinganon-CygwincompatibleMakeprogram."
echo"Currentlyusing:
`cygpath-m$GNUMAKE`"
echo""
echo"Tosolvetheissue,followthesesteps:
"
echo""
echo"1.EnsurethattheCygwin'make'packageisinstalled."
echo"NOTE:
YouwillneedGNUMake3.81orlater!
"
echo""
echo"2.DefinetheGNUMAKEenvironmentvariabletopointtoit,asin:
"
echo""
echo"exportGNUMAKE=/usr/bin/make"
echo""
echo"3.Call'ndk-build'again."
echo""
exit1
fi
fi$GNUMAKE-f$PROGDIR/build/core/build-local.mk"$@"下面我们对这些有效代码逐一进行分析:
PROGDIR=`dirname$0`
PROGDIR=`cd$PROGDIR&&pwd`在GNUmakefile中,两个反引号相当于shell函数,反引号括起来的内容相当于shell函数的参数。
而shell函数的功能就是调用操作系统的命令。
PROGDIR=`dirname$0`
linux命令dirname,功能是获取后面参数的路径。
例如:
#dirname../../../ndk-build执行的结果是:
"../../.."。
顺便提一下,这里不能用pwd命令,pwd命令,是获得当前路径,获取的是当前路径的绝对路径。
所以,上面两条语句的结果就是在PROGDIR变量中保存ndk-build所在的路径。
有了这两条语句之后,就可以在任何位置执行ndk-build,而不必非要在ndk根目录中执行。
再之后的两段语句,是用来确定不同平台下正确的make工具。
#IfGNUMAKEisdefined,checkthatitpointstoavalidfile
if[-n"$GNUMAKE"];then
ABS_GNUMAKE=`which$GNUMAKE2>/dev/null`
if[$?
!
=0];then
echo"ERROR:
YourGNUMAKEvariableisdefinedtoaninvalidname:
$GNUMAKE"
echo"Pleasefixittopointtoavalidmakeexecutable(e.g./usr/bin/make)"
exit1
fi
GNUMAKE="$ABS_GNUMAKE"
else
#Otherwise,use'make'andcheckthatitisavailable
GNUMAKE=`whichmake2>/dev/null`
if[$?
!
=0];then
echo"ERROR:
Cannotfind'make'program.PleaseinstallCygwinmakepackage"
echo"ordefinetheGNUMAKEvariabletopointtoit."
exit1
fi
fi#OnWindows,whenrunningundercygwin,checkthatweare
#invokingacygwin-compatibleGNUMakebinary.Itisunfortunately
#commonforappdeveloperstohaveanothernon-cygwincompatible
#
if["$OSTYPE"="cygwin"];then
GNUMAKE=`cygpath-u$GNUMAKE`
PROGDIR_MIXED=`cygpath-m$PROGDIR`
CYGWIN_GNUMAKE=`$GNUMAKE-f$PROGDIR_MIXED/build/core/check-cygwin-make.mk2>&1`
if[$?
!
=0];then
echo"ERROR:
Youareusinganon-CygwincompatibleMakeprogram."
echo"Currentlyusing:
`cygpath-m$GNUMAKE`"
echo""
echo"Tosolvetheissue,followthesesteps:
"
echo""
echo"1.EnsurethattheCygwin'make'packageisinstalled."
echo"NOTE:
YouwillneedGNUMake3.81orlater!
"
echo""
echo"2.DefinetheGNUMAKEenvironmentvariabletopointtoit,asin:
"
echo""
echo"exportGNUMAKE=/usr/bin/make"
echo""
echo"3.Call'ndk-build'again."
echo""
exit1
fi
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android NDK 编译脚本分析 之一 编译 脚本 分析