Android.mk
官方文档
位于jni目录下。用于向构建系统 描述sources和share libraries。相当于一个小版本的GNU makefile片段。
Android.mk允许你组织source到modules里,modules可以指stati library、share ilbrary或者单独的可执行文件(standalone executable)。
其可定义多个module,可以多个modules公用一个source file。构建系统只是将shared librarie放到你的应用包中。另外,static libraries可以生成shared libraries。
NDK构建系统自动处理依赖关系,不需要指定 头文件、显式的依赖。
Variables and Macros
可自定义变量,不可用系统保留名:
- 名字以LOCAL_ 前缀
- PRIVATE_ NDK_ APP 的前缀,构建系统内部使用
- 小写字母,如 my-dir
推荐用MY_前缀
NDK-defined include variables
在解析Android.mk文件前编译系统已定义好的GNU Make变量。在一些情况下,NDK会多次解析Android.mk,期间variable的值可能不同。
CLEAR_VARS
include $(CLEAR_VARS)
clean LOCAL_XXX
的参数(如LOCAL_MODULE
, LOCAL_SRC_FILES
, 和 LOCAL_STATIC_LIBRARIES
),但不cleanLocal_PATH
。
因为运行一个单独的GNU执行上下文,所有的local vairable都是全局的,所以需要配置module前clean下。
BUILD_SHARED_LIBRARY
该varaibel指向构建target为shared library的脚本,该脚本收集你提供的LOCAL_XXX参数,用于构建shared library。
注意该脚本需要至少定义LOCAL_MODULE and LOCAL_SRC_FILES
,构建后缀.so
BUILD_STATIC_LIBRARY
同上,只是用于构建stati library。
不会cop static library到你的projec、packages,但是可以用来build shared libraries(see LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRARIES)。
生成.a 后缀library
PREBUILT_SHARED_LIBRARY
LOCAL_SRC_FILES不作为source file,而是一个单独的执行share library的路径,如 foo/libfoo.so
也可以在别的module医用prebuit library(用LOCAL_PREBUILTS
)
PREBUILT_STATIC_LIBRARY
类比PREBUILT_SHARED_LIBRARY
Target information variables
TARGET_ARCH
CPU家族 arm, arm64, x86, or x86_64.
TARGET_PLATFORM
Android API level number, Android 5.1 对应22:android-22
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
supported CPU and architecture.
CPU and architecture Setting
ARMv7 armeabi-v7a
ARMv8 AArch64 arm64-v8a
i686 x86
x86-64 x86_64
example:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# \... do something \...
endif
描述模型的参数
通过variable向构建系统描述你的module,需要遵循如下步骤
- 使用CLEAR_VARS参数 初始化或undefine model的 variables
- 给variable赋值
- 设置合适的buil脚本,使用BUILD_XXX变量 (上文中的变量)
LOCAL_PATH
指定当前文件的路径,CLEAR_VARS不会清除该variable。
LOCAL_PATH := $(call my-dir)
必须定义LOCAL_PATH
my-dir事macro fucntion,由构建系统提供。返回当前路径(Android.mk的父路径)
LOCAL_CPP_EXTENSION
更改C++ sourc file默认后缀.cpp
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_MODULE
module名称,默认生成的library名称,为module名称加 lib前缀、.so或.a后缀
LOCAL_MODULE_FILENAME
指定modul出的library名称
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
假设为share library,则生成的库名称libnewfoo.so
LOCAL_SRC_FILES
compile module使用的source file。会自动依赖,相对于 LOCAL_PATH的相对路径,或绝对路径。
LOCAL_EXPORT_CFLAGS
记录C/C++的compiler flags给通过LOCAL_STATIC_LIBRARIES or LOCAL_SHARED_LIBRARIES 依赖的module的 LOCAL_CFLAGS
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
compile bar.c时,flags -DFOO=1 and -DBAR=2传递给compiler.
但是compile foo.c时不会有-DFoo=1这个flag
LOCAL_CPP_FEATURES
指定c++ features,优于LOCAL_CPPFLAGS直接定义-frtti and -fexceptions,LOCAL_CPPFLAGS导致compiler应用于所有的module,而不管是否需要
For prebuilt binaries, this variable also declares which features the binary depends on, thus helping ensure the final linking works correctly
LOCAL_CPP_FEATURES := rtti
LOCAL_CPP_FEATURES := exceptions
LOCAL_CPP_FEATURES := rtti features
LOCAL_C_INCLUDES
指定list of paths,相对于NDK的root目录,添加include搜索路径 在编译sources 时
LOCAL_C_INCLUDES := sources/foo
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
在设置LOCAL_CFLAGS or LOCAL_CPPFLAGS前定义。
系统使用的LOCAL_C_INCLUDES 当通过ndk-gdb进行native debug时
LOCAL_STATIC_LIBRARIES
当前module依赖的static libraries module列表。
当前module是shared library or
an executable,将强制其static libraries连接到最终的binary(二进制文件)内
当前是static library,仅仅表明依赖于当前module的module也将依赖于 这个variable的数据(static libraries)
LOCAL_CFLAGS
设置compiler flags当build c c++源码时。 LOCAL_CPPFLAGS 只用于C++
LOCAL_CFLAGS += -I<path>,
LOCAL_LDLIBS
运行时需要的系统库(-l作为库的前缀)
LOCAL_LDLIBS := -lz
如上告诉linker生成的module在加载的时候link /system/lib/libz.so
LOCAL_EXPORT_LDLIBS
传递系统的libraries给compiler,在library前加L
举例:foo作为static library,依赖于系统库。使用它去导出依赖。
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
当构建libbar.so时,使用-llog在linker命令的后面。这相当于告诉libbar.so依赖于foo,所以也依赖于系统logging library
NDK-provided function macros
my-dir
返回最近include的makefile,的路径,常用来定义LOCAL_PATH