Android.mk

来源:互联网 发布:成都java程序员工资 编辑:程序博客网 时间:2024/06/05 03:33

  android ndk开发有一个重要的文件 Android.mk,他虽然重要,但是对它进行深入介绍的文档却比较的少,这里将对Android.mk中常用的宏和变量进行说明:

    由于这一部分的内容多,资料零散,本文档会进行持续性的更新

    方便他人亦是方便自己,如果觉得还行就下右边投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!

工具/原料

  • Win7 x64
  • jdk1.8.0_11
  • adt-bundle-windows-x86_64-20140702
  • android-ndk-r10

变量

  1. 1

    LOCAL_PATH := $(call my-dir)

    1、解释 LOCAL_PATH

    英文:如下图

    中文:Android.mk 开始必须定义变量 LOCAL_PATH,它用来指定源文件的位置

    2、解释 my-dir

    英文:如下图

    中文:编译系统提供的'my-dir'宏函数,被用来获取当前的目录。

    Android.mk 常用宏和变量
  2. 2

    include $(CLEAR_VARS)

    1、解释 CLEAR_VARS:

    英文:如下图

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

    Android.mk 常用宏和变量
  3. 3

    LOCAL_MODULE := hello-jni

    1、解释 LOCAL_MODULE:

    英文:如下图

    中文:每一个android.mk文件中都必须定义一个模块标示 LOCAL_MODULE , 这个名字必须是唯一的并且不包含任何的空格,编译系统将自动的修改生成文件的前缀和后缀,如一个模块为'foo'共享库将被改为'libfoo.so';

        重要提示,如果你的模块名为'libfoo',编译系统生成的文件为 'libfoo.so', 而不会去再增加前缀,当你使用的时候,android平台会自动识别;

    Android.mk 常用宏和变量
  4. 4

    LOCAL_SRC_FILES := hello-jni.c

    1、解释 LOCAL_SRC_FILES

    英文:如下图

    中文:LOCAL_SRC_FILES必须包含一系列的C/C++源文件,他们将会被建立和装载到模块中,注意你不应该把需要包含的头文件列在这里,因为建立系统将自动计算依赖项,只有源文件才能够被编译器识别;

    2、解释 LOCAL_CPP_EXTENSION

    英文:如下图    

    中文:注意默认的c++文件扩展名是'.cpp', LOCAL_CPP_EXTENSION可以用来指定不同类型的扩展名,不要忘了前面的点(如:'.cxx' 将起作用, 但是 'cxx'不会起作用).

    如:LOCAL_CPP_EXTENSION := .cc .cpp

    Android.mk 常用宏和变量
  5. 5

    include $(BUILD_SHARED_LIBRARY)

    1、解释 BUILD_SHARED_LIBRARY

    英文:如下图

    中文:‘建立系统’提供个变量 BUILD_SHARED_LIBRARY, 将根据在‘include’之前定义的所有的信息和LOCAL_前缀的变量,决定将建立什么,如何正确的生成共享库;

    2、解释  BUILD_STATIC_LIBRARY

    英文: 如下图

    中文: 同上,只不过它生成的是静态库

    Android.mk 常用宏和变量
  6. 6

    LOCAL_C_INCLUDES :=   $(NDK_ROOT)/sources/third_party/freetype 

    1、解释 NDK_ROOT

    中文:NDK_ROOT 代表的是ndk的根目录,如我的是“D:\Android\android-ndk-r10”,这个例子是用来加载ndk根目录下的freetype的头文件路径;

  7. 7

    LOCAL_LDFLAGS := \

        $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libfreetype.a

    1、解释 LOCAL_LDFLAGS

    中文:用来加载用户自己的静态库(.a文件)

    2、解释 TARGET_ARCH_ABI

    中文:当前的cpu/abi的类型,在链接不同类型的CPU_ABI时非常有用,如下图

    Android.mk 常用宏和变量
  8. 8

    $(call import-add-path,$(LOCAL_PATH)/libsrc)

    1、解释:import-add-path

    中文:增加自己的路径到 NDK_MODULE_PATH 环境变量中,再非ndk根目录/sources下编译时会用到

  9. 9

    LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp

    $(error $(LOCAL_SRC_FILES))

    1、解释:$

    中文:变量前面加上"$"用来返回变量的值

    2、解释:$(error string)

    中文:用来将string所对应的内容打印到控制台,并且android.mk文件停止继续进行编译,如下图

    Android.mk 常用宏和变量
  10. 10

    LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp

    $(warning $(LOCAL_SRC_FILES))

    1、解释:$(warning string)

    中文:用来将string所对应的内容打印到控制台,并且android.mk文件将继续进行编译,如下图

    Android.mk 常用宏和变量
  11. 11

    LOCAL_PRELINK_MODULE := false  

    1、解释 LOCAL_PRELINK_MODULE

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

  12. 12

    LOCAL_EXPORT_CFLAGS := -DFOO=1

    1、解释 LOCAL_EXPORT_CFLAGS

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

  13. 13

    LOCAL_STATIC_LIBRARIES := foo

    1、解释 LOCAL_STATIC_LIBRARIES

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

  14. 14

    LOCAL_SHARED_LIBRARIES

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

  15. 15

    LOCAL_EXPORT_CPPFLAGS

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

  16. 16

    LOCAL_EXPORT_C_INCLUDES

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

  17. 17

    LOCAL_EXPORT_LDFLAGS

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

  18. 18

    LOCAL_EXPORT_LDLIBS

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

  19. 19

    LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

    允许未定义的符号

  20. 20

    LOCAL_CFLAGS

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

  21. 21

    LOCAL_LDLIBS

    用来链接共享库(so)或者执行文件,使用系统的库文件的时候,需要加上前缀 '-l',例如下面的例子,将告诉连接器生成的模块的时候同时链接 /system/lib/libz.so

    LOCAL_LDLIBS := -lz

    注意:如果你在一个模块中链接一个静态库,这个静态库是不会起作用的,同时ndk-build 会打印出一条警告消息

  22. 22

    LOCAL_CFLAGS    := -fvisibility=hidden

    隐藏库函数名

  23. 23

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

    LOCAL_PROGUARD_ENABLED:= disabled