2022年android_mk——编写规范[定 .pdf

上传人:Che****ry 文档编号:27248868 上传时间:2022-07-23 格式:PDF 页数:11 大小:175.41KB
返回 下载 相关 举报
2022年android_mk——编写规范[定 .pdf_第1页
第1页 / 共11页
2022年android_mk——编写规范[定 .pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《2022年android_mk——编写规范[定 .pdf》由会员分享,可在线阅读,更多相关《2022年android_mk——编写规范[定 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Android.mk文件语法规范序言此文档旨在描述Android.mk文件的语法, Android.mk文件为 Android NDK(原生开发)描述了你C/C+源文件。为了明白下面的内容,你必须已经阅读了docs/OVERVIEW.TXT 的内容,它解释了Android.mk文件扮演的角色和用途。概述:-写一个 Android.mk文件是为了向生成系统描述你的源代码。更明确的说:- 这个文件实际上是GNU Make文件的一小片段,它会被生成系统解析一次或多次。因此,你应该在Android.mk里尽量少地声明变量,而不要误以为在解析的过程中没有任何东西被定义。- 该文件的语法的明的人为了让你能

2、将你的源代码组织为组件(module).一个组件指的是下面的一项: - 一个静态库( static library) - 一个共享库( shared library)只有一个动态库会被安装/ 拷贝至你的application package中。但是静态库可用来生成动态库。你可以在每个Android.mk文件定义一个或多个组件,并且我可以在几个组件中使用相同的源文件。- 生成系统为你处理了一些琐碎之事。比如,在你的Android.mk里,你不须要列出头文件或列出生成的文件之间的明确认依赖关系。NDK生成系统会为你自动生成。这也意味着,当更新至新的NDK版本时,你能得到新的工具链/ 平台支持( t

3、oolchain/platform support) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 的好处 , 而无须修改你的android.mk文件。需要注意的是,此语法与完全开源的Android平台的 Android.mk文件的语法非常相似,但使用它们的生成系统的实现不同,这个为了让开发者能更容易的复用“外部”库的源代码。简单例子:-在详细描述语法之前,让我们探究一个简单的“hello JNI”例子,它的文件位于: ap

4、ps/hello-jni/projec这里,我们能看到:- 放有 Java 源文件的 src 文件夹。- 放有本地源文件,即jni/hello-jni.c的 jni文件夹。这个源文件实现一个简单的共享库。这个共享库有一个本地方法(native method) ,它将一个字符串返回给虚拟机应用(著:即Java 层应用程序)- jni/Anroid.mk文件为 NDK生成系统描述了这个共享库。它的内容为: - cut here - LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_S

5、RC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) - cut here -现在,让我们逐行解释:LOCAL_PATH := $(call my-dir)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 每个 Android.mk文件都必须以定义LOCAL_PATH 变量开始。 其目的是为了定位源文件的位置。在这个例子,生成系统提供的宏函数( macro functio

6、n)my-dir用来返回当前路径(即放有Android.mk文件的文件夹)include $(CLEAR_VARS)CLEAR_VARS 变量是生成系统提供的,它指向一个特殊的GNU Makefile.这个 Makefile将会为你自动清除许多名为LOCAL_XXX 的变量 ( 比如: LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等), 但 LOCAL_PATH 是例外,它不会被清除。这些变量的清除是必须的,因为所有的控制文件是在单一的 GNU make 执行环境中解析的,在这里所有的变量都是全局的。LOCAL_MODULE := h

7、ello-jni为了在你的Android.mk文件标识每个组件,必须定义LOCAL_MODULE 变量。这个名字必须要唯一的并且不能包含空格。注意:生成系统会自动地为相应生成的文件加入前缀或后缀。换言之,一个名叫foo的共享库组件会生成 libfoo.so.重要注意事项:如果你把组件取名为 libfoo, 生成系统将不会加上 lib前缀,还是生成 libfoo.so。这是为了支持源于Android平台源代码的Android.mk文件。LOCAL_SRC_FILES := hello-jni.cLOCAL_SRC_FILES 变量必须包含一系列将被构建和组合成组件的C/C+源文件。注意:你不需要

8、列出头文件或include文件,因为生成系统会为你自动计算出源文件的依赖关系。仅仅列出那些将直接传给编译器的源文件足矣。注意,默认的C+源文件的扩展名是 .cpp 。但你可以通过定义LOCAL_DEFAULT_EXTENSION 来指定一个扩展名。别忘了扩展名开始的那一点(比如, .cxx , 能行,但 cxx 不行) 。include $(BUILD_SHARED_LIBRARY)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - -

9、- 生成系统提供的BUIL_SHARED_LIBRARY 变量指向一个GNU Makefile脚本,这个脚本主管收集在最近的一次#include $(CLEAR_VARS)(著:即清除 本地 变量 ) 之后你所定义的LOCAL_XXX 变量的信息,并决定生成什么,如何准确的生成。BUILD_STATIC_LIBRARY可生成一个静态库。There are more complex examples under apps/, with commented Android.mk files that you can look at. 在 apps 文件下有一些复杂点的例子,它带有注释的Androi

10、d.mk文件以供你学习。参考:-以下列出你在Android.mk里应该依赖或定义的变量。你能定义其它变量,但下列的变量名是由 NDK生成系统保留的。- 以 LOCAL_ 开头的变量名 ( 比如, LOCAL_MODULE) - 以 PRIVATE_ ,NDK_ 或 APP_ ( 内部使用 ) 开头的量名_ 小写字母变量名( 内部使用 , 如 my-dir).如果你需要在Android.mk里定义方便自己使用的变量名,我们建议使用MY_ 前缀 , 如下面一个简单例子: - cut here - MY_SOURCES := foo.c ifneq ($(MY_CONFIG_BAR),) MY_SO

11、URCES += bar.c endif LOCAL_SRC_FILES += $(MY_SOURCES) - cut here - So, here we go:NDK提供的变量:- - - - - - - - - - - - - -名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 下列的这些GNU Make变量是在你的Android.mk被解析之前,就被生成系统事先定义的了 . 注意 , 在某些情况下,NDK 可能会多次解析

12、你的Android.mk,每次对其中一些变量的定义不同。CLEAR_VARS 指向一个生成脚本,这个脚本取消几乎所有LOCAL_XXX变量的定义(译者注:除了LOCAL_PATH) 。在开始描述一个新的组件之前,你必须include这个脚本, e.g. : include $(CLEAR_VARS) BUILD_SHARED_LIBRARY 指向一个生成脚本,这个脚本通过LOCAL_XXX变量收集关于组件的信息,并决定如何根据你列出来的源文件生成目标分享库。注意,在include这个脚本文件之前你必须至少已经定义了LOCAL_MODULE 和 LOCAL_SRC_FILES 。用法举例: in

13、clude $(BUILD_SHARED_LIBRARY) 注意,这会生成一个名为 lib$(LOCAL_MODULE).so的文件。 ( 译者注:$(BUILD_SHARED_MODULE)为文件名)BUILD_STATIC_LIBRARY 与 BUILD_SHARED_LIBRARY 类似,但用来生成目标静态库。静态库不会被拷贝至你的 project/packages文件夹下,但可用来生成分享库(参考 LOCAL_STATIC_LIBRARIES 和 LOCAL_STATIC_WHOLE_LIBRARIES,将在后面描述)用法示例: include $(BUILD_STATIC_LIBRA

14、RY)注意,这会生成一个方件名叫lib$(LOCAL_MODULE).a TARGET_ARCH 目标 CPU的名字,在完整的Android开源代码的生成中指定。对于基于ARM兼容的 CPU ,它被指定为 arm,与 CPU架构的修订无关。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - TARGET_PLATFORM 当解析该 Android.mk文件时用它来指定Andoid目标平台的名称。譬如,android-3与 Andr

15、oid 1.5系统镜像相对应。若要了解所有的平台名称及其相应的Android系统镜像,请阅读 docs/STABLE-APIS.TXTTARGET_ARCH_ABI 当解析该 Android.mk时, CPU+ABI的名称。目前只有一个值。 (译者注: ABI,Application Binary Interface,二进制应用程序接口) armeabi For Armv5TE armeabi 指定 Armv5TE 注意:到 NDK 1.6_r1为止,仅简单的定义这个变量为arm。但为了更好地配合 Android平台的内部使用,该值已重定义。关于 ABI 与相应的兼容问题更多详情,请阅读doc

16、s/CPU-ARCH-ABIS.TXT未来的 NDK版本将会引入其它的平台的ABI 并会有不同的名称。注意,所有基于ARM的 ABI会使 TARGET_ARCH定义为 arm,但可能拥有不同的TARGET_ARCH_ABI TARGET_ABI 目标平台与abi 的连接,它实际上被定义为 $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) ,当你想在一个真实的装置上测试特定的目标系统镜像时,它就很有用了。默认下,它的值为android-3-armeabi (在 Android NDK 1.6_r1及之前的版本,它的默认值为android-3-arm)名师资料总结 - -

17、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - NDK提供的宏函数 : -以下是一些GNU Make的宏函数,必须通过这样的形式调用:$(call )。函数返回文本信息。my-dir 返回放置当前Android.mk的文件夹相对于NDK生成系统根目录的路径。可用来在 Android.mk的开始处定义LOCAL_PATH 的值: LOCAL_PATH := $(call my-dir) all-subdir-makefiles 返回 my- dir

18、 子目录下的所有Android.mk。比如,代码的结构如下: sources/foo/Android.mk sources/foo/lib1/Android.mk sources/foo/lib2/Android.mk 如果 sources/foo/Android.mk里有这样一行 : include $(call all-subdir-makefiles) 那么,它将会自动地includesources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk 这个函数能将深层嵌套的代码文件夹提供给生成系统。注意,默认情况下,NDK仅在 source/*

19、/Android.mk里寻找文件。this-makefile 返回当前 Makefile(译者注:指的应该是GNU Makefile)的路径(即,这个函数是在哪里调用的)parent-makefile 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 返回在列入树(inclusion tree)中的父 makefile的路径。即,包含当前makefile的那个 makefile的路径。grand-parent-makefile

20、猜猜看 .(译者注:原文为Guess what.)组件描述相关的变量:- - - - - - - - - -以下的变量是用来向生成系统描述你的组件的。你应该在include $(CLEAR_VARS) 和include $(BUILD_XXXXX)之间定义其中的一些变量。正如在前面所说的,$(CLEAR_VARS) 是一个将会取消所有这些变量的脚本,除非在对变量的描述时有显式的说明。LOCAL_PATH 这个变量用来设置当前文件的路径。你必须在Android.mk的开始处定义它,比如: LOCAL_PATH := $(call my-dir) 这个变量不会被$(CLEAR_VARS)消除,所以

21、每个Android.mk仅需一个定义(以防你在同一个文件里定义几个组件)。LOCAL_MODULE 定义组件的名称。对于所有的组件名,它必须是唯一,且不能包含空格。在 include $(BUILD_XXX)之前你必须定义它。这个组件名决定生成的文件(译者注:即库名)。比如,lib,即这个组件的名称为 。但是在你的NDK生成文件(不管是Android.mk还是 Application.mk)中你只能通过正常的名称( 如, ) 来引用其它的组件。LOCAL_SRC_FILES 用它来定义所有用来生成组件的源文件。仅须列出传给编译器的文件,因为名师资料总结 - - -精品资料欢迎下载 - - -

22、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 生成系统会自动地计算它们的相互依赖关系。注意,所有文件名都是相对于LOCAL_PATH 的,你可以用到路径组件(path component) 如: LOCAL_SRC_FILES := foo.c (译者注:为连接符) toto/bar.cLOCAL_CPP_EXTENSION 这是一个可选的变量,可用它来指明C+源文件的扩展名。默认情况下是.cpp, 但你可以改变它。比如: LOCAL_CPP_EXTENSION := .cxx

23、LOCAL_C_INCLUDES 一个相对于相对于NDK*根* 目录可选的路径名单,当编译所有的源文件(C,C+和汇编)时,它将被添加进include搜索路径。例如: LOCAL_C_INCLUDES := sources/foo 或者甚至: LOCAL_C_INCLUDES := $(LOCAL_PATH)/./fooLOCAL_CFLAGS 一个可选的编译标记集,在生成C与 C+源文件时,将解析它。对指定额外的宏定义或编译选项很有用。重要:不要试图改变你Android.mk里的 optimization/debuggin level,通过在你的 Android.mk里指定合适的信息,它将被

24、自动处理,并使NDK生成调试时可用的有用的数据文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 注意:在 android-ndk-1.5_r1,相应的标记(flags)只适用于 C源文件,对C+ 源文件并不适用。为了适用于完整的Android生成系统的特性,已作了修正。(现在,你可以使用LOCAL_CPPFLAGS 为 C+文件指定标记)LOCAL_CXXFLAGS LOCAL_CPPFLAGS 的别名。注意,不建议使用这

25、个变量,因为在未来的NDK版本中,它可能会消失。LOCAL_CPPFLAGS 一个可选的编译标记集,* 仅*在生成 C+源文件时解析它。在编译器的命令行里它将在 LOCAL_CFLAGS 之后出现。注意:在 android-ndk-1.5_r1,相应的标记(flags)适用于 C与 C+源文件。为了适用于完整的Android生成系统的特性,已作了修正。(现在,你可以使用LOCAL_CFLAGS 为 C和 C+源文件指定标记)LOCAL_STATIC_LIBRARIES 一份 static libraries组件的名单(以BUILD_STATIC_LIBRARY的方式生成),它将被连接到欲生成的

26、组件上。这仅在生成shared library组件时有意义。(译者注:将指定的一个或多个static library module转化为一个shared library module)LOCAL_SHARED_LIBRARIES 一份该组件在运行期依赖于它的shared libraries *组件 * 。在连接时间 (link time)里与及为该生成的文件嵌入相应的信息都要用到它。注意,它并不将这份组件名单添加入生成图表(build graph)。即,在你的Android.mk 里,你仍应该将它们加入到你的应用程序要求的组件。LOCAL_LDLIBS 一份能在生成你的组件时用到的额外的连接器

27、标记(linkerflags)的名单。在传递有“ -l ”前缀的特殊系统库的名称时很有用。比如,下面的语句会告诉连接器在装载时间( load time)里生成连接到 /system/lib/libz.so的组件。 LOCAL_LDLIBS := -lz若想知道在这个NDK版本可以连接哪些暴露的系统库(exposed system libraries),请参见 docs/STABLE-APIS 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - -

28、 - - - - LOCAL_ALLOW_UNDEFINED_SYMBOLS 缺省值情况下, 当尝试生成一个shared library遇到没有定义的引用时,会导致“ undefined symbol”error 。这对在你的源代码里捕捉bugs 有很大的帮助。但是,因为一些原因你须要disable这个检查,将这个变量设置为true 。注意,相应的 shared library可能在运行期装载失败。LOCAL_ARM_MODE 缺省值情况下, ARM 目标二进制将会以 thumb模式生成,这时每个指令都是16-bit宽的。如果你想强迫组件的object文件以 arm( 32 位的指令)的模式生

29、成,你可以将这个变量定义为 arm。即: LOCAL_ARM_MODE := arm注意,你也可以通过将 .arm后缀添加到源文件名字的后面指示生成系统将指定的源文件以 arm 模式生成。例如: LOCAL_SRC_FILES := foo.c bar.c.arm告诉生成系统总是以arm 模式编译 bar.c ,但根据LOCAL_ARM_MODE的值生成 foo.c注意:在你的Application.mk里将 APP_OPTIM 设置为 debug,这也会强迫生成ARM二进制代码。这是因为工具链的调度器有bugs,它对 thumb 码的处理不是很好。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁