android.mk 的理解和使用

官方定义:
Android.mk 的语法用于将源文件分组为模块。 
模块是静态库、共享库或独立可执行文件。 

可在每个 Android.mk 文件中定义一个或多个模块,也可在多个模块中使用同一个源文件。 构建系统只会将共享库放入应用软件包。 此外,静态库可生成共享库。

除了封装库之外,构建系统还可为您处理各种其他详细信息。例如,您无需在 Android.mk 文件中列出标头文件或生成的文件之间的显式依赖关系。 

NDK 构建系统会自动为您计算这些关系。 因此,您应该能够享受到未来 NDK 版本中新工具链/平台支持的优点,而无需接触 Android.mk 文件。
个人理解
就是一个mk文件,然后向IDE的编译器说明要链接的模块
具体分析的必要性:
现在,需要具体分析,每个部分的作用是什么。是为了以后自己写的android.mk时,能够更好地解决一些问题。
具体语句:
-------------模块描述变量------------
1.LOCAL_PATH
表示源文件在开发树的位置
宏函数my_dir返回当前目录

2.include $(CLEAR_VARS)
清除许多LOCAL_XXX变量,但是不清除LOCAL_PATH.

3.LOCAL_MODULE := hello-jni
存储您要构建的模块的名称。
然后构建成最终共享库文件时,会在前缀添加lib
如果开头已经为lib,则不会添加额外前缀。

4.LOCAL_SRC_FILES := hello-jni.c
包含构建到模块中c/c++源文件列表

5.LOCAL_MODULE_FILENAME
此可选变量可让您覆盖构建系统默认用于其生成的文件的名称。
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo

补充:
1.LOCAL_CPP_EXTENSION(需要实践使用)
可以使用此可选变量为 C++ 源文件指明 .cpp 以外的文件扩展名。 例如,以下行会将扩展名改为 .cxx。

2.LOCAL_CPP_FEATURES(需要实践使用)
可以使用此可选变量指明您的代码依赖于特定 C++ 功能。它在构建过程中启用正确的编译器和链接器标志。
对于预构建的库,此变量还可声明二进制文件依赖哪些功能,从而帮助确保最终关联正确工作。 
建议使用此变量,而不要直接在 LOCAL_CPPFLAGS 定义中启用 -frtti 和 -fexceptions。

例如,要指示您的代码使用 RTTI(运行时类型信息),请编写:
LOCAL_CPP_FEATURES := rtti
要指示您的代码使用 C++ 异常,请编写:

LOCAL_CPP_FEATURES := exceptions
您还可为此变量指定多个值。例如:

LOCAL_CPP_FEATURES := rtti features

3.LOCAL_C_INCLUDES
可以使用此可选变量指定相对于 NDK root 目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到 include 搜索路径。 

个人理解:就是头文件的添加

4.LOCAL_CFLAGS
此可选变量为构建系统设置在构建 C 和 C++ 源文件时要传递的编译器标志。 此功能对于指定额外的宏定义或编译选项可能很有用。

尽量不要更改 Android.mk 文件中的优化/调试级别。构建系统可使用 Application.mk 文件中的相关信息自动为您处理此设置。 这样允许构建系统生成在调试时使用的有用数据文件。

注:在 android-ndk-1.5_r1 中,相应的标志只适用于 C 源文件,而不适用于 C++ 源文件。 它们现在与整个 Android 构建系统的行为匹配。(您现在可以使用 LOCAL_CPPFLAGS 只为 C++ 源文件指定标志。)

个人理解:就是设置编译器的一些配置信息

5.LOCAL_CPPFLAGS
仅当构建 C++ 源文件时才会传递一组可选的编译器标志。    

6.LOCAL_LDFLAGS+= -fuse-ld=bfd
构建共享库或可执行文件时供构建系统使用的其他链接器标志列表。
-------------库的构建------------
6.include $(BUILD_STATIC_LIBRARY)
静态库变量导致构建系统生成扩展名为 .a 的库

7.include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY指向GNU Makefile脚本。收集你在include 后 在 LOCAL_XXX变量定义的所有信息,确定你要构建的内容和操作方法。

8.include $(PREBUILT_STATIC_LIBRARY)
指向用于指定预建静态库的构建脚本。这里的 LOCAL_SRC_FILES 值不能是源文件, 而必须是指向预建静态库的单一路径,例如 foo/libfoo.so。

9.include $(PREBUILT_SHARED_LIBRARY)
指向用于指定预建共享库的构建脚本。这里的 LOCAL_SRC_FILES 值不能是源文件, 而必须是指向预建共享库的单一路径,例如 foo/libfoo.so。

补充,还有其他变量可以使用
但是太多,不一一列举

-------------平台的兼容------------
10.TARGET_ARCH
Android 开放源代码项目所指定的目标 CPU 架构的名称。对于与 ARM 兼容的任何构建,请使用独立于 CPU 架构修订版或 ABI 的 arm。
简单一点,就是可以用来判断是否兼容某个CPU架构
(参阅下面的 TARGET_ARCH_ABI)

11.TARGET_PLATFORM
作为构建系统目标的 Android API 级别号。这个要参考。https://developer.android.google.cn/ndk/guides/stable_apis.html
其实

12.TARGET_ARCH_ABI
当构建系统解析此 Android.mk 文件时,此变量将 CPU 和架构的名称存储到目标。
例如:
 ARMv8 AArch64 设置为目标 CPU 与 ABI 的组合
TARGET_ARCH_ABI := arm64-v8a

13.LOCAL_LDLIBS:= -lfoo
通知构建系统您的原生模块需要在加载时链接库。例如,如需链接 /system/lib/libfoo.so

ps:初步个人理解,共享库为动态库,在执行时才被调用,与静态库相对


13.TARGET_ABI
目标 Android API 级别与 ABI 的联接,特别适用于要针对实际设备测试特定目标系统映像的情况






--------------------------------
变量与宏
很多以下变量已经定义,其他变量可以自己定义:
1.以LOCAL_开头
2.以PRIVATE_ NDK_ 或者APP开头的名称
3.小写名称,如my-dir 
4.建议,如果要定义自己的变量可以在前面添加MY_

整体初步理解:

(1)要引入哪些cpp文件,主要使用LOCAL_SRC_FILES。然后使用include $(BUILD_SHARED_LIBRARY)构建

(2)要引入.a文件,主要使用LOCAL_SRC_FILES。然后使用include $(PREBUILT_STATIC_LIBRARY) 

(3)设置链接库以及配置,使用LOCAL_LDLIBS、 LOCAL_LDFLAGS 

(4)设置编译器的配置,使用LOCAL_CFLAGS

(5)设置include 的头文件寻找LOCAL_C_INCLUDES

(6)TARGET_XXXX,都是机构、cpu  和  api版本的设置

(7)设置本文件关键地址  LOCAL_PATH

(8)每次新一轮赋值,可以清理,使用include $(CLEAR_VARS)

(9)存储要构建的模块名称,使用LOCAL_MODULE := hello-jni
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值