android.mk 的理解和使用

来源:互联网 发布:java项目开发难点 编辑:程序博客网 时间:2024/06/11 11:31
官方定义:
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 := fooLOCAL_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 features3.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_ARCHAndroid 开放源代码项目所指定的目标 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-v8a13.LOCAL_LDLIBS:= -lfoo通知构建系统您的原生模块需要在加载时链接库。例如,如需链接 /system/lib/libfoo.sops:初步个人理解,共享库为动态库,在执行时才被调用,与静态库相对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
原创粉丝点击