Android.mk简单介绍、规则与基本格式

文章目录

    • Android.mk与makefile区别
    • Android.mk规则
    • Android.mk基本格式

Android.mk与makefile区别

Android.mk 和 Makefile 都是用于构建代码项目的构建脚本文件,但是它们在特定上下文中有一些区别:

  1. Android.mk:
    • Android.mk 是用于构建 Android 应用或库项目的构建文件,通常用于基于 Android NDK 的 C/C++ 项目。
    • Android.mk 文件采用类似 GNU Make 的语法,但有一些 Android 特定的规则和函数,比如 LOCAL_MODULEinclude $(BUILD_SHARED_LIBRARY) 等。
    • Android.mk 文件用于描述 Android 项目中的模块、库依赖关系、编译选项等。
  2. Makefile:
    • Makefile 是一个通用的构建工具文件,可用于构建各种类型的项目,不仅限于 Android 开发。
    • Makefile 使用 GNU Make 编程语言,通过指定目标、依赖关系和命令来描述构建过程。
    • Makefile 可用于编译和链接任何类型的项目,包括 C、C++、Java 等。

Android.mk规则

以下是一些常用的 Android 特定规则和函数:

  1. include $(BUILD_SHARED_LIBRARY): 包含共享库构建规则,用于构建一个共享库。
  2. include $(BUILD_STATIC_LIBRARY): 是一个规则,包含静态库构建规则,用于构建一个静态库
  3. include $(PREBUILT_STATIC_LIBRARY) :是一个变量,用于引用预先编译好的静态库文件。通过使用 PREBUILT_STATIC_LIBRARY 变量,可以将预先编译好的静态库文件包含到当前 Android.mk 文件中,以便在编译链接过程中使用该静态库。
  4. include $(BUILD_EXECUTABLE):是一个规则,用于构建一个可执行文件(executable)
  5. LOCAL_PATH:一个常用的变量,用于表示当前 Android.mk 文件所在的目录路径。在 Android 开发中,通常会使用 LOCAL_PATH 变量来获取当前 Android.mk 文件所在的路径,方便在定义模块属性时引用该路径。
  6. include $(CLEAR_VARS):CLEAR_VARS变量是生成系统提供的,它指向一个特殊的GNU Makefile.这个Makefile将会为你自动清除许多名为LOCAL_XXX的变量(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),但LOCAL_PATH是例外,它不会被清除。这些变量的清除是必须的,因为所有的控制文件是在单一的GNU make执行环境中解析的,在这里所有的变量都是全局的。
  7. LOCAL_MODULE: 指定当前模块的名称。
  8. LOCAL_SRC_FILES: 指定当前模块的源文件列表。
  9. LOCAL_C_INCLUDES: 指定当前模块的头文件搜索路径。
  10. LOCAL_CFLAGS: 指定当前模块的 C 编译选项。
  11. LOCAL_CPPFLAGS: 指定当前模块的 C++ 编译选项。
  12. LOCAL_LDLIBS: 指定当前模块链接时需要的动态链接库(.so 文件)。可以使用 -l 参数指定需要链接的库,例如:-llog 表示链接系统日志库。
  13. LOCAL_SHARED_LIBRARIES: 指定当前共享库模块依赖的其他共享库。
  14. LOCAL_STATIC_LIBRARIES:指定当前模块依赖的静态库。注意:引用了两个有调用关系的静态库的时候,需要把其中被调用的库放在调用者的后面

Android.mk基本格式

 jni/Anroid.mk文件为NDK生成系统描述了这个共享库。它的内容为:
---------- 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变量开始。其目的是为了定位源文件的位置。在这个例子,生成系统提供的宏函数(macro function)‘my-dir'用来返回当前路径(即放有Android.mk文件的文件夹)
include $(CLEAR_VARS)
CLEAR_VARS变量是生成系统提供的,它指向一个特殊的GNU Makefile.这个Makefile将会为你自动清除许多名为LOCAL_XXX的变量(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),但LOCAL_PATH是例外,它不会被清除。
这些变量的清除是必须的,因为所有的控制文件是在单一的GNU make执行环境中解析的,在这里所有的变量都是全局的。
LOCAL_MODULE := hello-jni
为了在你的Android.mk文件标识每个组件,必须定义LOCAL_MODULE变量。这个名字必须要唯一的并且不能包含空格。注意:生成系统会自动地为相应生成的文件加入前缀或后缀。换言之,一个名叫foo的共享库组件会生成'libfoo.so'重要注意事项:如果你把组件取名为‘libfoo',生成系统将不会加上‘lib'前缀,还是生成libfoo.so。这是为了支持源于Android平台源代码的Android.mk文件。
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含一系列将被构建和组合成组件的C/C++源文件。
注意:你不需要列出头文件或include文件,因为生成系统会为你自动计算出源文件的依赖关系。仅仅列出那些将直接传给编译器的源文件足矣。注意,默认的C++源文件的扩展名是‘.cpp'。但你可以通过定义LOCAL_DEFAULT_EXTENSION
来指定一个扩展名。别忘了扩展名开始的那一点(比如,‘.cxx’,能行,但‘cxx'不行)。
include $(BUILD_SHARED_LIBRARY)
生成系统提供的BUIL_SHARED_LIBRARY变量指向一个GNU Makefile脚本,这个脚本主管收集在最近的一次#include $(CLEAR_VARS)(即清除本地变量)之后你所定义的LOCAL_XXX变量的信息,并决定生成什么,如何准确的生成。
BUILD_STATIC_LIBRARY可生成一个静态库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅析FAT32文件系统

本文通过实验测试了FAT文件系统的存储规律,并且探究了部分可能的文件隐藏方法。 实验背景 现有一块硬盘(U盘),其中存在两个分区,分别为FAT32和NTFS文件系统分区。 在FAT分区中存在如下文件: 现需要阅读底…

聚合函数AVG/SUM/MAX/MIN/COUNT/COUNT(*)例子

当然,我可以为你提供SQL中聚合函数AVG、SUM、MAX、MIN、COUNT和COUNT(*)的例子。这些函数通常用于SELECT语句中,与GROUP BY子句一起使用来对数据进行分组和聚合。 以下是一些示例: AVG(平均值) 假设我们有一个名为s…

决策控制类软件项目的团队配置

决策控制类软件项目的团队配置怎样才是最合适的?目的就是实现高效的项目协作以及为企业降本增效。软件项目的主要费用来源是研发人员的开支以及差旅费用。 下面的思维导图从项目与产品的关系、团队架构、项目成员配置、项目可复制性、招聘这几点进行说明如何组织人…

抖音分享链接视频下载

import requests import re from urllib.parse import unquote import json from pprint import pprint from selenium import webdriver from selenium.webdriver.chrome.options import Options import os def get_video_id(url): # 创建一个Chrome WebDriver实例 ch…

六招搞定,SPA单页面加载速度慢的问题。

众所周知,SPA页面有很多优点,但是首屏加载慢的问题一直被诟病,本文介绍几种解决策略,希望对老铁们有所帮助。 一、SPA页面的独有优势 1. 更快的用户体验: SPA在加载初始页面后,可以在用户与应用程序交互…

抖音小店怎么对接达人合作?五种方法分享,合作成功率超级高!

大家好,我是电商糖果 有很多刚开店的小店商家,经常会出现一个问题。 那就是不会找达人合作,有的朋友说是因为他社恐,还有的说达人不好沟通等等。 理由有很多,总结下来就是找达人合作这事儿太难了,干不了…

ros2编写pcl节点加载pcd文件

初次学习ros2和pcl,尝试在ros2中创建节点,加载pcd文件,并在rviz中进行可视化,记录一下整个过程。 编辑环境 ubuntu20.04 ros2_foxy 创建节点 mkdir -p proj_ws_pcl/src #创建工程文件夹 cd proj_ws_pcl/src #创建源码文件夹 …

东风畅行科技股份有限公司 软件开发 面试总结/腾云悦智科技(深圳)有限责任公司

东风畅行科技股份有限公司/java开发工程师/一面/30min 最熟悉的项目dubbo服务注册的原理微服务中的网关可以做哪些事情有没有了解过eurekaredis的数据类型有哪些,介绍一下redis的集群和哨兵模式redis的槽位是多少redis的持久化机制redis的rdb和aof区别kafak集群分片是怎么设置…

HTTP头注入:深入分析与实战防御策略

引言 在Web安全领域,SQL注入是众所周知的攻击手段,但许多人可能没有意识到,HTTP头也可以成为注入攻击的媒介。通过HTTP头注入,攻击者可能获取敏感信息、绕过认证机制或破坏数据完整性。本文将深入分析HTTP头注入的原理、技术&…

labview_开放协议

一、开放协议 二、硬件设置 英格索兰硬件设置: 三、配套测试软件 四、Labview代码

docker system prune命令详解

docker system prune 是 Docker 中的一个命令,用于清理 Docker 系统中的未使用资源,以帮助回收磁盘空间。这个命令执行一系列操作来删除不再需要的项目,具体包括: 删除所有已停止的容器。删除所有未被任何容器引用的网络&#xf…

新手困 ViewModel与Activting的databinding2个对象 区别

在Android开发中,ViewModel与Activity的Binding并不是同一个概念,它们分别指的是不同的功能和用途。 ViewModel: ViewModel是一个为UI界面提供数据的类,它负责管理Activity或Fragment的数据。ViewModel类持有数据的引用,即使配置…

文心智能体大赛:百度文心智能体平台初体验

写在前面 博文内容涉及:文心智能体大赛:文心智能体初体验理解不足小伙伴帮忙指正 😃,生活加油 我徒然忘记了热闹,却来不及悟透真正的清冷(《四喜忧国》) 前言 徒然忘记了热闹,却来不及悟透真正的清冷(《四喜忧国》),在…

【Spring Boot】在项目中使用Spring AI

Spring AI是Spring框架中用于集成和使用人工智能和机器学习功能的组件。它提供了一种简化的方式来与AI模型进行交互。下面是一个简单的示例,展示了如何在Spring Boot项目中使用Spring AI。 步骤 1: 添加依赖 首先,在pom.xml文件中添加Spring AI的依赖&…

记一次MySQL执行修改语句超时问题

异常问题 原因分析 这个问题发生在开发环境,怀疑是提交事务时终止项目运行,没有提交该事务,造成死锁 调试该事务时时间太长,为什么说有这个原因呢,因为通过查找日志显示 The client was disconnected by the server …

Java面试八股之什么是锁消除和锁粗化

什么是锁消除和锁粗化 锁消除(Lock Elimination): 锁消除是Java虚拟机(JVM)进行的一种高级优化策略,旨在消除那些没有必要存在的同步操作,以减少不必要的性能开销。这一优化发生在即时编译器&a…

求两个整数最大公约数的方法

可以使用递归来实现,编写gcd函数返回最终的结果(最大公约数)。传入两个参数,如果存在一个数字不大于0就返回0,利用上面的公式就可以得出最后的结果。

前端日志收集(monitor-report v1)

为什么 为什么自己封装而不是使用三方 类似 Sentry 这种比较全面的 因为 Sentry 很大我没安装成功,所有才自己去封装的 为什么使用 可以帮助你简单解决前端收集错误日志、收集当前页面访问量,网站日活跃,页面访问次数,用户行…

事了拂衣去看世界

今天为我在网易将近18年的工作画上一个句号。 5年前我写过一篇文章,叫《人生不过几次关键的选择》,三个月前我对自己的人生再次做出选择,决定离开网易创业。我担任总经理的网易数帆和智企整合成新的数智事业部,我负责的杭州研究院…

面向对象编程的奥秘:封装与继承

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、封装的魅力 封装的应用 封装示例 二、继承的力量 继承的应用 继承示例 三、总结 一…