多语言展示
当前在线:537今日阅读:23今日分享:25

Android.mk 常用宏和变量

android ndk开发有一个重要的文件 Android.mk,他虽然重要,但是对它进行深入介绍的文档却比较的少,这里将对Android.mk中常用的宏和变量进行说明:    由于这一部分的内容多,资料零散,本文档会进行持续性的更新;    方便他人亦是方便自己,如果觉得还行就下右边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!
工具/原料
1

Win7 x64

2

jdk1.8.0_11

3

adt-bundle-windows-x86_64-20140702

4

android-ndk-r10

变量
1

LOCAL_PATH := $(call my-dir)1、解释 LOCAL_PATH:英文:如下图中文:Android.mk 开始必须定义变量 LOCAL_PATH,它用来指定源文件的位置2、解释 my-dir:英文:如下图中文:编译系统提供的'my-dir'宏函数,被用来获取当前的目录。

2

include $(CLEAR_VARS)1、解释 CLEAR_VARS:英文:如下图中文:编译系统提供CLEAR_VARS变量,它指向了一个用来清除 LOCAL_ 开头的变量(LOCAL_PATH除外)的makefile文件,需要它的原因是整个的编译上下文中,所有的变量都是全局的,这样就可以保证这些变量只在局部范围内起作用;

3

LOCAL_MODULE := hello-jni1、解释 LOCAL_MODULE:英文:如下图中文:每一个android.mk文件中都必须定义一个模块标示 LOCAL_MODULE , 这个名字必须是唯一的并且不包含任何的空格,编译系统将自动的修改生成文件的前缀和后缀,如一个模块为'foo'共享库将被改为'libfoo.so';    重要提示,如果你的模块名为'libfoo',编译系统生成的文件为 'libfoo.so', 而不会去再增加前缀,当你使用的时候,android平台会自动识别;

4

LOCAL_SRC_FILES := hello-jni.c1、解释 LOCAL_SRC_FILES英文:如下图中文:LOCAL_SRC_FILES必须包含一系列的C/C++源文件,他们将会被建立和装载到模块中,注意你不应该把需要包含的头文件列在这里,因为建立系统将自动计算依赖项,只有源文件才能够被编译器识别;2、解释 LOCAL_CPP_EXTENSION英文:如下图    中文:注意默认的c++文件扩展名是'.cpp', LOCAL_CPP_EXTENSION可以用来指定不同类型的扩展名,不要忘了前面的点(如:'.cxx' 将起作用, 但是 'cxx'不会起作用).如:LOCAL_CPP_EXTENSION := .cc .cpp

5

include $(BUILD_SHARED_LIBRARY)1、解释 BUILD_SHARED_LIBRARY英文:如下图中文:‘建立系统’提供个变量 BUILD_SHARED_LIBRARY, 将根据在‘include’之前定义的所有的信息和LOCAL_前缀的变量,决定将建立什么,如何正确的生成共享库;2、解释  BUILD_STATIC_LIBRARY英文: 如下图中文: 同上,只不过它生成的是静态库

6

LOCAL_C_INCLUDES :=   $(NDK_ROOT)/sources/third_party/freetype 1、解释 NDK_ROOT中文:NDK_ROOT 代表的是ndk的根目录,如我的是“D:\Android\android-ndk-r10”,这个例子是用来加载ndk根目录下的freetype的头文件路径;

7

LOCAL_LDFLAGS := \    $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libfreetype.a1、解释 LOCAL_LDFLAGS中文:用来加载用户自己的静态库(.a文件)2、解释 TARGET_ARCH_ABI中文:当前的cpu/abi的类型,在链接不同类型的CPU_ABI时非常有用,如下图

8

$(call import-add-path,$(LOCAL_PATH)/libsrc)1、解释:import-add-path中文:增加自己的路径到 NDK_MODULE_PATH 环境变量中,再非ndk根目录/sources下编译时会用到

9

LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp$(error $(LOCAL_SRC_FILES))1、解释:$中文:变量前面加上'$'用来返回变量的值2、解释:$(error string)中文:用来将string所对应的内容打印到控制台,并且android.mk文件停止继续进行编译,如下图

10

LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp$(warning $(LOCAL_SRC_FILES))1、解释:$(warning string)中文:用来将string所对应的内容打印到控制台,并且android.mk文件将继续进行编译,如下图

11

LOCAL_PRELINK_MODULE := false  1、解释 LOCAL_PRELINK_MODULE:中文:关闭编译器链接前进行代码优化,防止将没有用到的代码不添加到生成的库中

12

LOCAL_EXPORT_CFLAGS := -DFOO=11、解释 LOCAL_EXPORT_CFLAGS定义这个变量来记录一些列的 c/c++编译标志,他们将会增加到其他的使用这个模块的LOCAL_CFLAGS中,LOCAL_CFLAGS的功能相当于:LOCAL_STATIC_LIBRARIES 和 LOCAL_SHARED_LIBRARIES 这两个变量;

13

LOCAL_STATIC_LIBRARIES := foo1、解释 LOCAL_STATIC_LIBRARIES链接进来一个静态库的模块,这里是静态库的模块的名称,而不是静态库的名称

14

LOCAL_SHARED_LIBRARIES链接进来一个动态库的模块,这里是动态库的模块的名称,而不是静态库的名称

15

LOCAL_EXPORT_CPPFLAGS跟  LOCAL_EXPORT_CFLAGS 的功能一样,但是它只能够在c++中使用

16

LOCAL_EXPORT_C_INCLUDES跟 LOCAL_EXPORT_CFLAGS,但是对于c的 include路径,被调用模块申明后,使用模块可以很方便的使用包含的路径

17

LOCAL_EXPORT_LDFLAGS跟LOCAL_EXPORT_CFLAGS的作用一样,但是仅仅是链接选项

18

LOCAL_EXPORT_LDLIBS跟LOCAL_EXPORT_CFLAGS的作用类似,但是这个变量说明的系统库,需要带上 '-l' 前缀,他们将导入链接器选项,并追加到你的模块的  LOCAL_LDLIBS

19

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true允许未定义的符号

20

LOCAL_CFLAGS.c文件对应的编译标记变量

21

LOCAL_LDLIBS用来链接共享库(so)或者执行文件,使用系统的库文件的时候,需要加上前缀 '-l',例如下面的例子,将告诉连接器生成的模块的时候同时链接 /system/lib/libz.soLOCAL_LDLIBS := -lz注意:如果你在一个模块中链接一个静态库,这个静态库是不会起作用的,同时ndk-build 会打印出一条警告消息

22

LOCAL_CFLAGS    := -fvisibility=hidden隐藏库函数名

23

LOCAL_PROGUARD_ENABLED默认是打开的,不特别指定的话,就是起作用的,就可能做优化。LOCAL_PROGUARD_ENABLED:= disabled

推荐信息