Android NDK Application.mk(中文翻译)
作者:阿宝
更新:2016-08-31
来源:彩色世界(https://blog.hz601.org/2016/07/26/android-NDK-application-mk/index.html)
英文原版: Android NDK Application.mk
前言
Application.mk文件用来说明一款APP依赖于哪些本地模块。本地模块可以是静态链接库,动态链接库,或者可执行文件。
注: 我们强烈建议你在阅读本文之前,先阅读 Android.mk,以便更好的理解。
概述
Application.mk文件是一个迷你的GNU Makefile片段,用来定义一些编译变量。Application.mk文件一般放在$PROJECT/jni/目录下,其中$PROJECT代表项目目录。也可以把文件放在$NDK/app//目录下,其中$NDK为NDK根目录,为项目简称。例如
$NDK/apps/<myapp>/Application.mk
变量
APP_PROJECT_PATH
此变量值必须是项目根目录的绝对路径。用于指定JNI生成的.so文件的安装路径或拷贝路径。
注:此变量对于概述中的第一种方法是可选的,但对于第二种方法却是必须的。
APP_OPTIM
可选值为 release 或 debug。用来设置编译器的编译优化级别。
默认为 release 模式,用于生成优化过的二进制机器码。debug 模式用于生成未优化的二进制机器码,方便调试错误。
无论在哪种模式下,都可以进行调试。不同的是在release模式下调试器可提供的信息更少。比如,一些被优化过的变量,是无法用于检查,单步调试,或者跟踪的。
如果在项目的manifest文件中声明了 android:debuggable 标签,那么Apllication.mk文件中此变量的默认值被修改为 debug。你也可以在Apllication.mk文件中设置此变量来覆盖manifest文件中的设置。
APP_CFLAGS
此变量用来指定编译C/C++代码的编译选项。当你需要修改某个指定模块的编译参数时,可以修改此变量,而不必去修改Android.mk文件。
此变量中涉及到的文件路径,可以使用相对路径(相对于NDK根目录),或绝对路径。例如
sources/foo/Android.mk
sources/bar/Android.mk
如果你想要在编译模块时把bar目录添加进foo/Android.mk文件中,可以这样做:
APP_CFLAGS += -Isources/bar
或者这样:
APP_CFLAGS += -I$(LOCAL_PATH)/../bar
注意,不能使用 -I../bar 这样的方式,因为它会被编译器解析为 -I$NDK_ROOT/../bar,这明显不是我们想要的结果。
注: 在android-ndk-1.5_r1版本中,此变量只能用于C代码。之后的版本中C/C++都是支持的。
APP_CPPFLAGS
此变量用来指定编译C++代码的编译选项。
注: 在android-ndk-1.5_r1版本中,此变量同时适用于C和C++代码。之后的版本中只支持C++代码。如果要同时支持C/C++代码,可以使用APP_CFLAGS变量。
APP_LDFLAGS
此变量用来指定生成应用时使用到的链接选项。此选项用于编译动态链接库和可运行程序,当编译静态链接库时,此选项被忽略。
APP_BUILD_SCRIPT
此变量用来指定NDK编译脚本,默认为jni/Android.mk。可以使用相对路径(相对于NDK根目录),或绝对路径。
APP_ABI
默认情况下,NDK会使用'armeabi' ABI来生成二进制机器码,这是基于ARMv5TE并支持浮点运算的机器码。可以使用此变量来指定不同的ABI。下表中列出了适用于不同指令集的 ABI 选项。
表1:不同指令集下的 APP_ABI 设置
| 指令集 | 取值 |
|---|---|
| 支持基于armv7 FPU指令集的设备 | APP_ABI := armeabi-v7a |
| ARMv8 AArch64 | APP_ABI := x86 |
| IA-32 | APP_ABI := x86 |
| Intel64 | APP_ABI := x86_64 |
| MIPS32 | APP_ABI := mips |
| MIPS64 (r6) | APP_ABI := mips64 |
| 支持所有指令集 | APP_ABI := all |
注: 从NDKr7开始支持all取值。
你可以同时指定多个取值,取值之间使用空格分隔。例如
APP_ABI := armeabi armeabi-v7a x86 mips
有关可用的ABI列表,信息,及使用限制,参考这里ABI Management。
APP_PLATFORM
此变量用来指定目标Android平台的名称。例如'android-3'代表了Android 1.5系统。完整的Android平台名称及系统版本参见Android NDK Native APIs。
APP_STL
默认情况下,NDK通过Androoid自带的迷你C++运行库(system/lib/libstdc++.so)来提供标准C++头文件。另外,NDK提供了可供选择的C++实现,你可以通过此变量来指定在程序内使用或链接的C++库。更多有关支持的C++库和特性参见这里NDK Runtimes and Features。
APP_SHORT_COMMANDS
此变量用来给所有的模块设置LOCAL_SHORT_COMMANDS选项。更详细的说明查看 Android.mk 的LOCAL_SHORT_COMMANDS选项。
NDK_TOOLCHAIN_VERSION
此变量用来指定编译器(默认为GCC)的版本。64位ABI默认GCC版本为4.9,32位默认为4.8。如果使用Clang编译器,可选值为clang3.4 或 clang3.5 或 clang。clang表示使用最新版本。
APP_PIE
安卓动态链接器,从4.1系统(API 16)开始支持基于位置的可执行程序(PIE)特性。从5.0系统(API 21)开始,可执行程序依赖于PIE特性。通过设置-fPIE选项来编译支持PIE的可执行程序。糟糕的是,这个选项会让随机代码位置引起的内存泄露的分析变得更加困难。
如果项目目标为SDK 16或以上版本,ndk-build会默认启用此选项。当然你也可以设置为false来禁用此选项。
此选项仅对可执行程序有效。换句话说,在编译动/静态库时使用无任何效果。
注: 此选项不支持安卓4.1以前的系统。
APP_THIN_ARCHIVE
此选项用来给所有的模块设置LOCAL_THIN_ARCHIVE默认值。更多信息请查看Android.mk的LOCAL_THIN_ARCHIVE选项。
Android NDK Application.mk(中文翻译)的更多相关文章
- Android NDK: Application targets deprecated ABI(s): armeabi Open File
Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi Error:(82) Android NDK: Suppo ...
- Android NDK and OpenCV Development With Android Studio
Android NDK and OpenCV Development With Android Studio Hujiawei 172 2014年10月22日 发布 推荐 0 推荐 收藏 4 收藏,5 ...
- Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')
在 Android 中移植一个库(该库 使用了 libstlport )时 产生如下错误: ./obj/local/armeabi/objs/jniWrapper/native.o: In funct ...
- Android NDK开发指南---Application.mk文件和android.mk文件
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...
- Android NDK学习(二):编译脚本语法Android.mk和Application.mk
一.Android.mk Android.mk分为一下几部分: LOCAL_PATH:= $(call my-dir), 返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量. i ...
- Android NDK开发指南(一) Application.mk文件
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2381586.html Application.mk目的是描述在你的应用程序中所需要的模 ...
- Android: NDK中的Android.mk和Application.mk
1. 简介 Android.mk 可用来描述要编译的某个具体模块的相关信息.比如:指定编译该模块时所需要的源文件.编译该模块时要链接的库文件.该模块编译完成后生成的库的名字等等.Applicatio ...
- Android NDK 学习之Application.mk
Application.mk file syntax specification Introduction: This document describes the syntax of Applica ...
- Android NDK编程之Android.mk和Application.mk
Android编程使用NDK必须创建一个jni文件夹,并且jni文件里一般包含有C/C++的源码文件.Android..mk文件.Application.mk文件(可选),Android.mk文件的编 ...
随机推荐
- 【SqlServer系列】表单查询
1 概述 如下几个问题,如果你能解决,请继续往下看,若不能解决,请先复习SQL基础知识,再来阅读本篇文章.本篇文章深度中等左右. Q1:表StudentScores如下,用一条SQL语句查询出每门 ...
- C#传入一个时间值,判断年月日时分秒
/// <summary> /// 功能:某张表的一个时间字段更新的时间停止了多久(和数据库现在的时间比较) /// keyname:数据库参数 ///BGDataService.Quer ...
- C# 哈希表(Hashtable)用法笔记
一.什么是Hashtable? Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对.它使用键来访问集合中的元素. 当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值.哈 ...
- [CF373C]计算袋鼠是愉快的(Counting Kangaroos is Fun)-贪心
Problem 计算袋鼠是愉快的 题目大意 有n只袋鼠,如果一个袋鼠体积是另一个袋鼠的两倍或以上,则小袋鼠能被大袋鼠装进袋子里,装进去后就看不到袋子里的袋鼠了,问这群袋鼠如何行动才能使得它们看着数量最 ...
- Linux下搭建FTP服务器(Ubuntu16.04)
搞了下FTP服务器,基本上能遇到的问题都遇到了-.-! 先说步骤: 1.安装vsftpd软件包 sudo apt-get install vsftpd 2.打开配置文件 vim /etc/vsftpd ...
- Android--Intent组件带参传递与返回
Android 是 单例模式: 表示 application 唯一的.每个应用被启动的时候,其实是 application 被创建. Context 上下文: context 是 Applicatio ...
- laravel数据库查询返回的数据形式
版本:laravel5.4+ 问题描述:laravel数据库查询返回的数据不是单纯的数组形式,而是数组与类似stdClass Object这种对象的结合体,即使在查询构造器中调用了toArray(), ...
- vue获取下拉框值
vue获取下拉框的值,用vue-modle,只有点击下拉框的值才会赋值到下拉框中,初始时下拉框没有数据,而改用$event就不会出现这样的问题,下面看代码以及图解: v-model解决方式: < ...
- 最小生成树详解 prim+ kruskal代码模板
最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...
- python 中 list 的各项操作
最近在学习 python 语言.大致学习了 python 的基础语法.觉得 python 在数据处理中的地位和它的 list 操作密不可分. 特学习了相关的基础操作并在这里做下笔记. ''' Pyth ...