Android中JNI开发(二)Android.mk写法

本文详细解析了Android.mk文件的写法及关键配置项的作用,包括LOCAL_PATH、CLEAR_VARS、LOCAL_MODULE等,介绍了如何定义共享库和静态库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android.mk文件的写法:
 ---------- cut here ------------------
   LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

   LOCAL_MODULE    := hello-jni
   LOCAL_SRC_FILES := hello-jni.c

   include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------


现在,让我们解释一下这几行:

  LOCAL_PATH := $(call my-dir)
一个Android.mk文件的开头必须LOCAL_PATH变量的定义。它是用来在开发树中查找源文件。在这个例子中,宏功能“my-dir”,提供构建系统,用于返回在当前目录(即该目包含的路径Android.mk文件本身)。

  $(CLEAR_VARS)
通过构建系统和点到CLEAR_VARS变量特殊的GNU Makefile文件,这个文件中将清除许多LOCAL_XXX的变量为你(例如LOCAL_MODULE ,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等等。),与除LOCAL_PATH。这是必要的,因为所有的建设控制文件都在一个单一的GNU Make的执行上下文分析所有的变量。

  LOCAL_MODULE:= HELLO-JNI
LOCAL_MODULE变量必须被定义来确定每个模块,你描述在你的Andr​​oid.mk。该名称必须是*独特的和不包含任何空格。需要注意的是,构建系统会自动添加适当的相应的生成的文件的前缀和后缀。换言之,一个命名为'foo'的共享库模块将产生'libfoo.so“。

重要注意事项:
如果你的名字你的模块libfoo的,构建系统不会添加另一种的'lib'前缀,并会生成libfoo.so。这是为了支持Android.mk文件,源于Android平台。

  LOCAL_SRC_FILES:= HELLO-jni.c
LOCAL_SRC_FILES变量必须包含C和/或C + +源文件的列表文件将被建造和组装到模块中。需要注意的是,你应该没有列出头文件和包含的文件,因为生成系统将
自动为你建立链接,只列出源文件将被直接传递给编译器即可。

需要注意的是C + +源文件的默认扩展名是“.CPP。这是
然而,可以通过定义变量指定一个不同的LOCAL_CPP_EXTENSION。不要忘了最初的“.”(即“.CXX”,而不是“CXX”)。

  $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是由编译系统提供的一个变量,即一个GNU Makefile脚本,负责收集所有的中定义的LOCAL_XXX变量,因为最新的信息“include $(CLEAR_VARS)”,并决定建立什么,以及如何做到这一点。还有BUILD_STATIC_LIBRARY生成静态库。也就是说:
include $(BUILD_SHARED_LIBRARY)与include $(BUILD_STATIC_LIBRARY)将决定当前的库以共享方式还是静态的方式来创建
在一个Android.mk中可定义多个库,结构如下:
include $(CLEAR_VARS)
LOCAL_MODULE    := native
LOCAL_SRC_FILES := native.c
include $(BUILD_SHARED_LIBRARY)

     除此(LOCAL_MODULE)之外, 在开发中还可以通过include方式来引入其它的mk文件来进行模块化

### Android.bp 和 Android.mk 的区别及用法 #### 文件格式差异 `Android.mk` 使用的是 GNU Makefile 格式,而 `Android.bp` 则采用了一种更现代化的声明性配置语言 Blueprints (Blueprints DSL)[^5]。这种设计使得 `Android.bp` 更加简洁易读,并减少了冗余。 #### 构建系统支持版本 `Android.mk` 被广泛应用于基于旧版 Android 构建系统的项目中,即 Soong 之前的构建系统。然而,在 Android 7.0 (Nougat) 及之后的版本中,Google 推出了新的构建工具链——Soong,它主要依赖于 `Android.bp` 来描述模块和其属性[^6]。因此,对于较新版本的 Android 源码树来说,推荐优先使用 `Android.bp` 进行模块定义。 #### 性能表现对比 由于 `Android.bp` 是通过解析 JSON-like 数据结构实现快速加载与处理,相比起传统 make 工具逐行解释执行的方式效率更高,从而显著缩短了大型项目的编译时间[^7]。 #### 功能特性比较 - **条件判断**: 在 `Android.mk` 中可以灵活运用各种宏定义来进行复杂的逻辑控制;而在 `Android.bp` 当前仅限于简单的布尔表达式或者列表操作来决定某些字段是否存在。 - **变量作用域管理**: `Android.mk` 支持全局范围内的环境设置共享给多个目标文件; 对应到 `Android.bp`, 所有参数都必须显式指定,不存在隐式的继承关系。 - **跨平台兼容性考虑**: 如果涉及到不同架构下的差异化编译需求,则需分别编写各自的规则集放入对应的目录下。此时两者并无本质差别,均要遵循特定命名约定以便正确匹配所需资源路径。 以下是两个典型例子展示它们各自写法上的异同: ```makefile # Example of Android.mk file content. LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) ``` ```json // Equivalent representation using Android.bp format. cc_library_shared { name: "hello-jni", srcs: ["hello-jni.c"], } ``` 尽管如此,实际开发过程中可能还会遇到混合使用的场景,这是因为部分遗留代码尚未完全迁移到新体系之下所致[^8]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值