Android.mk语法

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

可自定义变量,不可用系统保留名:

  1. 名字以LOCAL_ 前缀
  2. PRIVATE_ NDK_ APP 的前缀,构建系统内部使用
  3. 小写字母,如 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,需要遵循如下步骤

  1. 使用CLEAR_VARS参数 初始化或undefine model的 variables
  2. 给variable赋值
  3. 设置合适的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

其他的先省略,以后写吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值