Android.mk文件语法详述

  1. 概述

Android.mk文件是用来描述build system(编译系统)的,更准确的说:该文件是一个微型的GNU Makefile片段,将由build system解析一次或者多次。
这个文件的目的是用来允许你将源文件组织成模块,这个模块中含有:一个静态库(.a文件) 或 一个动态库(.so文件)
只有动态库才会被安装/复制到你的应用程序包,尽管静态库可以被用来生成动态库。
你可以在每个模块中 都定义一个Android.mk文件,你也可以让多个模块共用一个Android.mk文件。build system可以为你处理许多细节,

例如:你不需要在Android.mk文件中列出头文件或者其他的依赖关系,这些NDK的build system会自动为你计算并处理。这也意味着,当更新到新版本的NDK的时候,你应该得益于新的toolchain/platform的支持,而无需修改你的Android.mk文件。

( 注意:这些语法非常接近于分布在完整的开源的Android源代码中的Android.mk文件,尽管是build system实现的,但是它们的用法是不同的。这样故意设计的决定是为了让应用程序开发者重用“外部”库的源代码更容易。)

实例分析

‘jni/Android.mk’ 文件描述了如何生成一个共享库,它的内容是:
—————–Android.mk————————
LOCAL_PATH := (callmydir)include (CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

(1). LOCAL_PATH:=$(call my-dir) ———-必须

Android.mk文件必须以LOCAL_PATH变量开始,它用于在树中定位文件。
宏功能’my-dir’是由build system提供的,用于返回当前目录路径(包括Android.mk文件本身)

(2). include $(CLEAR_VARS) ———-必须

CLEAR_VARS变量是由build system提供的,并且指明了一个GNU makefile文件,这个功能会清理掉所有以LOCAL_开头的内容(例如LOCAL_MODULE , LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等 ),除了LOCAL_PATH,这句话是必须的,因为如果所有的变量都是全局变量的话,所有的可控的编译文件都需要在一个单独的GNU中被解析并执行

(3). LOCAL_MODULE :=hello-jni ———-必须

LOCAL_MODULE变量必须被定义,用来区分Android.mk中的每一个模块。文件名必须是唯一的,不能有空格。
注意,这里编译器会为你自动加上一些前缀和后缀,来保证文件是一致的,比如:这里表明一个动态连接库模块被命名为”hello-jni”,但是最后会生成为”libhello-jni.so”文件。

(4). LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES变量被需包括一个C和C++源文件的列表,这些会编译并聚合到一个模块中。
注意:这里并不需要你列出头文件和被包含的文件,因为编译系统会自动为你计算相关的属性,源代码中的列表会直接传递给编译器。 C++默认文件的扩展名是“.cpp”,我们可以通过定义一个LOCAL_DEFAULT_CPP_EXTENSION变量来定义一个不同的C文件。
不要忘记在初始化前面的“.”点(也就是说”.cpp”可以正常工作,但是cpp不能正常工作)

(5). include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY这个变量是由系统提供的,并且指定给GNU Makefile的脚本,
它可以收集所有你定义的”include $(CLEAR_VARS)”中以LOCAL_开头的变量,并且决定哪些要被编译,哪些应该做的更加准确。编译生成的是以”lib.so”的文件,这个就是共享库了。
我们同样也可以使用BUILD_STATIC_LIBRARY编译系统便会生成一个以”lib.a”的文件来供动态库调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android.mk 文件Android NDK(Native Development Kit)中的一个重要文件,它用于构建 Android 应用的 C/C++ 代码。Android.mk 文件是一个 Makefile,它描述了如何编译和链接 C/C++ 源代码文件以生成共享库(.so 文件)或可执行文件Android.mk 文件通常位于 JNI(Java Native Interface)目录下,用于指定要编译的源代码文件、编译选项、链接选项等。以下是一个示例 Android.mk 文件的简单结构: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 编译选项 LOCAL_CFLAGS := -Werror # 源文件 LOCAL_SRC_FILES := \ file1.c \ file2.c # 生成的共享库名称 LOCAL_MODULE := mylib include $(BUILD_SHARED_LIBRARY) ``` 在这个示例中,`LOCAL_PATH` 定义了当前 Android.mk 文件所在的路径。`include $(CLEAR_VARS)` 清空了之前的变量设置,以便重新定义新的变量。`LOCAL_CFLAGS` 定义了编译选项,这里设置为 `-Werror` 表示将所有警告视为错误。`LOCAL_SRC_FILES` 定义了要编译的源文件列表。`LOCAL_MODULE` 定义了生成的共享库的名称。 通过编写 Android.mk 文件,您可以根据项目的需求自定义编译和链接规则,以及添加其他依赖库等。完成 Android.mk 文件的编写后,可以使用 ndk-build 命令来执行编译和链接操作,生成最终的共享库文件。 请注意,Android.mk 文件在最新的 Android Gradle 插件中已经不再被推荐使用,而是使用 CMake 或 ndk-build 的 Android.bp 文件进行构建。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值