Android: NDK中的Android.mk和Application.mk
1. 简介
Android.mk 可用来描述要编译的某个具体模块的相关信息。比如:指定编译该模块时所需要的源文件、编译该模块时要链接的库文件、该模块编译完成后生成的库的名字等等。
Application.mk 可用来描述整个应用程序编译时的相关信息。比如:指定编译支持的ABI平台(armeabi-V7a, arm64-v8a, all...)、指定NDK编译时的模块列表、指定目标Android 平台的名称等等。
2. 一个简单的Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c jnihelp.cpp Calculator.cpp
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH: 必须位于Android.mk文件的开始,用来定义源文件的位置,$(call my-dir)返回当前路径,即android.mk所在的目录。my-dir是构建系统提供的宏函数,它将会返回当前目录的路径;
include $(CLEAR_VARS): 清除除LOCAL_PATH之外的所有LOCAL_XXX变量。这个清理动作是必须的,因为所有的编译控制文件都是由同一个GNU Make解析和执行,其变量是全局的,只有清理后才能避免相互影响。
LOCAL_MODULE: 表示Android.mk所在模块的模块名,名字必须唯一且不包含空格。构建系统在生成最终的so库文件时,会参考该模块名生成最终的so库,如:libhello-jni.so;
LOCAL_SRC_FILES: 编译该模块时所需的C/C++源文件,如果有多个文件需要用空格分离,如果想换行则需要在每个源文件末尾加上反斜杠"\" ,类似于C语言中的多行宏定义;
include ${BUILD_SHARED_LIBRARY}: 确定要构建的内容及其操作方法。BUILD_SHARED_LIBRARY 表示要编译为动态库,构建系统会生成后缀名为.so的库文件;BUILD_STATIC_LIBRARY 表示要编译为静态库,构建系统会生成后缀名为.a 的为文件。
该文件中的一些扩展的变量:
# 指定头文件所在的目录
LOCAL_C_INCLUDES := $(LOCAL_PATH) # 指定在构建动态库或可执行文件时需要链接的其它库列表,如Android系统提供的日志库,OpenGL ES, EGL等
# 每个链接的库文件都必须加上-l 前缀(注意是小写英文字母l,不是数字1)
# 多个链接的库文件使用空格分隔
LOCAL_LDLIBS += -llog -landroid -lc
3. 一个简单的Application.mk文件
APP_ABI = armeabi-v7a
APP_MODULES = hello-jni
APP_ABI:指定支持的ABI平台。上面所示为armeabi-v7a, 可选的值有all (代表全平台)、arm64-v8a、x86、x86_64,多个平台用空格隔开。
APP_MODULES:如果指定,那么NDK只会编译列出的模块列表,模块名用空格隔开,如果没有指定那么NDK会编译所有的Android.mk声明的所有的LOCAL_MODULE模块。
该文件的一些扩展的变量:
# 指定目标Android平台的名称
APP_PLATFORM = android- # 是否支持C++标准库
APP_STL := stlport_static # 为项目中的所有C++编译传递的标记
APP_CPPFLAGS := -frtti -fexceptions -std=c++
4. 多个编译模块的处理
有时候要编译的模块(UDP、FFmpeg、Openssl、libyuv)比较多,如果把所有的C/C++代码放到同一个目录下会显得比较乱,因此可以在每一个模块下都定义一个Android.mk文件,然后在jni 的根目录下放置一个Android.mk文件,内容如下:
include $(call all-subdir-makefiles)
比如:

5. 其它注意事项
1. 以LOCAL_、PRIVATE_、NDK_、APP_ 开头的名称是NDK编译系统的保留变量名称,在自定义变量时不要以以上变量名打头。如果你想在Android.mk文件中定义自己的变量,建议在名称前附加 MY_;
2. Makefile中的 := 、?=、+=、= 的区别。= 是最基本的赋值,:= 是覆盖之前的值,?= 是如果没有被赋值过就赋予等号后面的值,+= 是添加等号后面的值。
参考链接:
1. Google Developers —— NDK Android.mk说明
2. Android.mk中以LOCAL_ 打头的变量说明
3. Android 中的android.mk 和 application.mk 文件编写(总结版)
4. Makefile 中:= ?= += =的区别
5. JNI学习——关于Android.mk / Application.mk
Android: NDK中的Android.mk和Application.mk的更多相关文章
- Android NDK开发指南(一) Application.mk文件
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2381586.html Application.mk目的是描述在你的应用程序中所需要的模 ...
- Android NDK开发之Android.mk文件
Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南 Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...
- 关于Android NDK中调用第三方的动态库
因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...
- 谈谈Android NDK中动态链接库(.so文件)的优化
做了不少NDK相关的工作,不知道别人有没有同样的困惑,经常在编译C/C++代码的时候会出一些error或者warning,然后在网上搜,发现在Android.mk或者Application.mk文件中 ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- Android NDK中的C++调试踩坑标记
RT, Android NDK中的C++调试, GDB调试比较麻烦,在ADT Eclipse中: 1.配置好NDK给工程加上Native Support 2.编译中加上NDK_DEBUG=1 3.然后 ...
- Android NDK 学习之Android.mk
Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk ...
- Android开发过程中在sh,py,mk文件中添加log信息的方法
Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...
- 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...
随机推荐
- Python之路(第四十三篇)线程的生命周期、全局解释器锁
一.线程的生命周期(新建.就绪.运行.阻塞和死亡) 当线程被创建并启动以后,它既不是一启动就进入执行状态的,也不是一直处于执行状态的,在线程的生命周期中,它要经过新建(new).就绪(Ready).运 ...
- 记录一次Oracle创建DBLink踩到小坑
1.查询当前是否具有创建DBlink的权限: select * from user_sys_privs where privilege like upper('%DATABASE LINK%'); 如 ...
- 国内不fq安装K8S二: 安装kubernet
目录 2 安装kubelet 2.1 环境准备 2.2 设置国内的源 2.3 重要的设置 2.4 获取镜像 2.5 使用kubeadm init初始化集群 2.6 安装Pod Network 2.7 ...
- Redis持久化 - RDB和AOF
原文:https://segmentfault.com/a/1190000016021217 一.持久化的作用 1. 什么是持久化 持久化(Persistence),即把数据(如内存中的对象)保存到可 ...
- 项目Beta冲刺 用户试用报告
课程: 软件工程1916|W(福州大学) 作业要求: 项目Beta冲刺 团队名称: 火鸡堂 作业目标: 火鸡堂 队员学号 队员姓名 博客地址 备注 221600111 彼术向 http://www.c ...
- 20180606模拟赛T1——猫鼠游戏
题目描述: 猫和老鼠在10*10的方格中运动,例如: *...*..... ......*... ...*...*.. .......... ...*.C.... *.....*... ...*... ...
- 安装GO
1.中文社区 下载地址 https://studygolang.com/dl 选择自己操作系统版本 2.找到适合你系统的版本下载,本人下载的是windows版本.也可以下载Source自己更 ...
- win10 系统运行加速方法
win10系统就是不太好用,很多功能我们硬件跟不上,会拖累系统运行速度,之前将win10优化了一部点,但是有些地方反而降低运行速度,因此需要关闭:1.磁盘的优化,这个说实话,可以自己来优化,没必要时刻 ...
- linux 查看硬盘使用情况
在windows系统中,我们可以很容易的查看磁盘的使用情况,在linux系统中,我们可以使用命令来查看磁盘使用情况. 1.df命令 作用:用来查看硬盘的挂载点,以及对应的硬盘容量信息.包括硬盘的总大小 ...
- jmeter+ant+jenkins搭建接口自动化测试环境(基于win)
1.jmeter jmeter依赖java运行环境,所以需要提前下载jdk并配置好环境变量 官网下载(http://jmeter.apache.org/download_jmeter.cgi),我用的 ...