2022年android_mk——编写规范[定 .pdf
《2022年android_mk——编写规范[定 .pdf》由会员分享,可在线阅读,更多相关《2022年android_mk——编写规范[定 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年android_mk编写规范定 2022 android_mk 编写 规范
限制150内