Android.mk语法说明(android ndk开发)(2)

在samples目录下有几个复杂的例子,在他们的Android.mk文件中你可以看到一些注释。

Reference:

下面是你可以在Android.mk文件里可以直接使用或是定义的变量的列表。你能够定义其它的变量供自己使用,但是下面的变量名是NDK编译系统的保留字:

- 以LOCAL_ 开头命名的 (例如LOCAL_MODULE)
- 以PRIVATE_,NDK_ 或是 APP_  命名的(仅供内部使用)
- 以小写字母命名的(仅供内部使用, 例如 'my-dir')

如果你需要在Android.mk文件里定义一个你自己使用比较方便的变量,我们建议使用MY_前缀,这是一个普通的例子:

MY_SOURCES := foo.c
    ifneq ($(MY_CONFIG_BAR),)
      MY_SOURCES += bar.c
    endif

LOCAL_SRC_FILES += $(MY_SOURCES)

好,我们接着看:

NDK提供的变量:

在你的Android.mk文件解析之前,编译系统定义了这些GNU Make变量。注意,在某种情况下NDK可能会多次解析你的Android.mk文件,每一次解析某些变量的定义可能不同。

CLEAR_VARS

指向一个几乎所有在"Module-description"部分列出的LOCAL_XXX变量都没有定义的编译脚本(我的理解就是在编译前清空所有变量,然后在这个变量的下面再重新定义)。在开始一个新的module之前你必须包含这个脚本,例如:

include $(CLEAR_VARS)

BUILD_SHARED_LIBRARY

指向一个收集所有你提供的关于module的LOCAL_XXX变量的信息的编译脚本,然后决定如何根据你列出的资源编译一个目标shared library。注意,你在包含这个变量之前必须至少OCAL_MODULE 和LOCAL_SRC_FILES 变量。可以这样使用:

include $(BUILD_SHARED_LIBRARY)

注意它将生成一个以lib$(LOCAL_MODULE).so命名的文件。

BUILD_STATIC_LIBRARY

BUILD_STATIC_LIBRARY变量的不同之处在于它是用来生成一个目标static ibrary 。static ibrary 不会被打包进你的工程包,但是可以用来生成shared library(看下面的LOCAL_STATIC_LIBRARIES 和LOCAL_STATIC_WHOLE_LIBRARIES说明)。可以这样使用:

include $(BUILD_STATIC_LIBRARY)

注意,它将生成一个以lib$(LOCAL_MODULE).a命名的文件。

TARGET_ARCH

指明一个full Android open-source build明确说明的目标CPU架构。如果是“arm”用来所有的兼容ARM的编译,不依赖与CPU架构版本。

TARGET_PLATFORM

当Android.mk文件解析时,指明一个android目标平台。例如"android-3”对应"android1.5"系统镜像。完整的平台名字和android系统镜像的对应列表可以阅读docs/目录下STABLE-APIS.TXT文档。

TARGET_ARCH_ABI

当Android.mk文件解析时,指明一个目标CPU+ABI。有两个值可供使用:

armeabi
            对应Armv5TE

armeabi-v7a

注意:Android NDK 1.6_r1之上的版本,这个变量被定义为'arm'。然而,这个变量的重定义能够被Android platform内部更好的使用。

对于更多的ABI架构和对应的兼容性问题的细节,可以阅读docs目录下的CPU-ARCH-ABIS.TXT文档。

其他的ABI架构将会在以后的NDK版本中引入,并且有不同的名字。注意,所有基于ARM的ABIs都会被'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'是默认的)

NDK提供的宏函数

下面是GNU Make宏函数,通过使用'$(call <function>)'来获得他的值。它们返回文本信息。

my-dir

返回相对于上层的NDK编译系统的当前Android.mk文件目录的路径。这对于以下面这种方式在你的Android.mk文件的开始定义LOCAL_PATH变量很有用:

LOCAL_PATH := $(call my-dir)

all-subdir-makefiles

返回当前所有在'my-dir'路径下以及他的子路径下的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)

这时它将自动包含 sources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk文件。

这个函数能用来为编译系统提供深层嵌套的资源目录层次结构。注意,默认情况下 ,NDK只会在sources/*/Android.mk目录下寻找文件。

this-makefile

返回当前Makefile文件的路径(例如,函数在哪里被调用)。

parent-makefile

放回父Makefile文件在包含树中的路径。例如包含当前Makefile文件的Makefile文件的路径。

Module描述变量

下面的变量是用来向系统描述你的module的。你应该在一个'include $(CLEAR_VARS)'和'一个include $(BUILD_XXXXX)'变量之间定义它们中的某些变量。前面的部分已经介绍过了,$(CLEAR_VARS)变量是取消/清除所有这些变量的定义,除非在他们的描述说明确地注明。

LOCAL_PATH

这个变量用来给出当前文件的路径。你必须在你的Android.mk文件的开始定义它,比如下面这样定义是可以的:

LOCAL_PATH := $(call my-dir)

这个变量不会被$(CLEAR_VARS)清除掉,所以在每一个Android.mk文件中仅需要定义一次(在你的一个文件中定义了几个module的情况下)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzpjj.html