Android NDK 学习之Application.mk
Application.mk file syntax specification
Introduction:
This document describes the syntax of Application.mk build files written to describe the native modules required by your Android application. To understand what follows, it is assumed that you have read the OVERVIEW file that explains their role and usage.
Readers of this document should have read OVERVIEW and ANDROID-MK.
Overview:
The purpose of Application.mk is to describe which native 'modules' (i.e. static/shared libraries) are needed by your application.
An Application.mk file is usually placed under $PROJECT/jni/Application.mk, where $PROJECT points to your application's project directory.
Another alternative is to place it under a sub-directory of the top-level $NDK/apps directory, e.g.:
$NDK/apps/<myapp>/`Application.mk`
Where is a short name used to describe your 'application' to the NDK build system (this name doesn't go into your generated shared libraries or your final packages).
The Application.mk is really a tiny GNU Makefile fragment that must define a few variables:
APP_PROJECT_PATH
This variable should give the absolute path to your Application's project root directory. This is used to copy/install stripped versions of the generated JNI shared libraries to a specific location known to the APK-generating tools.
Note that it is optional for
$PROJECT/jni/Application.mk, but mandatory for$NDK/apps/<myapp>/Application.mk
APP_MODULES
If this variable is defined, it tells
ndk-buildto only list the corresponding modules and those that they depend on. It must be a space-separated list of module names as they appear in theLOCAL_MODULEdefinition of Android.mk files.It the variable is undefined,
ndk-buildlooks for the list of all installable top-level modules, i.e. those listed by your Android.mk and any file it includes directly. Imported modules are not top-level though.An installable module is either a shared library or executable, which will generate a file in
libs/$ABI/.If the variable is undefined, and there are no installable top-level modules in your project, then
ndk-buildwill build all top-level static libraries and their dependencies instead. However, these libraries will be placed at the usual location underobj/orobj-debug/.NOTE: This variable's behaviour changed in NDK r4. Before that:
- the variable was mandatory in your `Application.mk`
- all required modules had to be listed explicitly.
APP_OPTIM
This optional variable can be defined to either '
release' or 'debug'. This is used to alter the optimization level when building your application's modules.A 'release' mode is the default, and will generate highly optimized binaries. The 'debug' mode will generate un-optimized binaries which are much easier to debug.
Note that if your application is debuggable (i.e. if your manifest sets the
android:debuggableattribute to "true" in its<application>tag), the default will be 'debug' instead of 'release'. This can be overridden by settingAPP_OPTIMto 'release'.Note that it is possible to debug both 'release' and 'debug' binaries, but the 'release' builds tend to provide less information during debugging sessions: some variables are optimized out and can't be inspected, code re-ordering can make stepping through the code difficult, stack traces may not be reliable, etc...
APP_CFLAGS
A set of C compiler flags passed when compiling any C or C++ source code of any of the modules. This can be used to change the build of a given module depending on the application that needs it, instead of modifying the Android.mk file itself.
IMPORTANT WARNING: +++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ All paths in these flags should be relative to the top-level NDK
+ directory. For example, if you have the following setup:
+
+ sources/foo/Android.mk
+ sources/bar/Android.mk
+
+ To specify in foo/Android.mk that you want to add the path to the
+ 'bar' sources during compilation, you should use:
+
+ APP_CFLAGS += -Isources/bar
+
+ Or alternatively:
+
+ APP_CFLAGS += -I$(LOCAL_PATH)/../bar
+
+ Using '-I../bar' will *NOT* work since it will be equivalent to
+ '-I$NDK_ROOT/../bar' instead.
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NOTE: In android-ndk-1.5_r1, this only applied to C sources, not C++ ones. This has been corrected to match the full Android build system.
APP_CXXFLAGS
An alias for
APP_CPPFLAGS, to be considered obsolete as it may disappear in a future release of the NDK.
APP_CPPFLAGS
A set of C++ compiler flags passed when building C++ sources only.
NOTE: In android-ndk-1.5_r1, this applied to both C and C++ sources. This has been corrected to match the full Android build system. You can now use
APP_CFLAGSfor flags that shall apply to C and C++ sources.
APP_LDFLAGS
A set of linker flags passed when linking application. This only applies when building shared libraries and executables, these flags are ignored when building static libraries.
APP_BUILD_SCRIPT
By default, the NDK build system will look for a file named Android.mk under
$(APP_PROJECT_PATH)/jni, i.e. for the file:
$(APP_PROJECT_PATH)/jni/Android.mk
If you want to override this behaviour, you can define
APP_BUILD_SCRIPTto point to an alternate build script. A non-absolute path will always be interpreted as relative to the NDK's top-level directory.
APP_ABI
By default, the NDK build system will generate machine code for the '
armeabi' ABI. This corresponds to an ARMv5TE based CPU with software floating point operations. You can useAPP_ABIto select a different ABI.For example, to support hardware FPU instructions on ARMv7 based devices, use:
APP_ABI := armeabi-v7a
Or to support the IA-32 instruction set, use:
APP_ABI := x86
Or to support the MIPS instruction set, use:
APP_ABI := mips
Or to support all at the same time, use:
APP_ABI := armeabi armeabi-v7a x86 mips
Or even better, since NDK r7, you can also use the special value '
all' which means "all ABIs supported by this NDK release":
APP_ABI := all
For the list of all supported ABIs and details about their usage and limitations, please read CPU-ARCH-ABIS.
APP_PLATFORM
Name the target Android platform. For example, '
android-3' correspond to Android 1.5 system images. For a complete list of platform names and corresponding Android system images, readSTABLE-APIS.
APP_STL
By default, the NDK build system provides C++ headers for the minimal C++ runtime library (
/system/lib/libstdc++.so) provided by the Android system.However, the NDK comes with alternative C++ implementations that you can use or link to in your own applications. Define
APP_STLto select one of them. Examples are:
APP_STL := stlport_static --> static STLport library
APP_STL := stlport_shared --> shared STLport library
APP_STL := system --> default C++ runtime library
For more information on the subject, please read CPLUSPLUS-SUPPORT.
APP_GNUSTL_FORCE_CPP_FEATURES
In prior NDK versions, the simple fact of using the GNU libstdc++ runtime (i.e. by setting
APP_STLto either 'gnustl_static' or 'gnustl_shared') enforced the support for exceptions and RTTI in all generated machine code. This could be problematic in specific, but rare, cases, and also generated un-necessarily bigger code for projects that don't require these features.This bug was fixed in NDK r7b, but this means that if your code requires exceptions or RTTI, it should now explicitly say so, either in your
APP_CPPFLAGS, or yourLOCAL_CPPFLAGS/LOCAL_CPP_FEATURESdefinitions.To make it easier to port projects to NDK r7b and later, one can optionally defined
APP_GNUSTL_CPP_FEATURESto contain one or more of the following values:
exceptions -> to enforce exceptions support for all modules.
rtti -> to enforce rtti support for all modules.
For example, to get the exact same behaviour than NDK r7:
APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
IMPORTANT: This variable is provided here as a convenience to make it easier to transition to a newer version of the NDK. It will be removed in a future revision. We thus encourage all developers to modify the module definitions properly instead of relying on it here.
APP_SHORT_COMMANDS
The equivalent of
LOCAL_SHORT_COMMANDSfor your whole project. See the documentation for this variable in ANDROID-MK.
NDK_TOOLCHAIN_VERSION
Define this variable to either 4.4.3 or 4.6 to select version of GCC compiler. 4.6 is the default
APP_PIE
Starting from Jelly Bean (4.1), Android's dynamic linker supports position-independent executables (PIE), which are built with
-fPIE. This flag makes it harder to exploit memory corruption bugs by randomization the location of the code. By default,ndk-buildwill automatically set this value to 'true' if your project targetsandroid-16or higher. You may set it manually to either 'true' or 'false'.IMPORTANT: PIE executables cannot run on Android releases prior to 4.1.
Note that this only applies to executables. It has no effect when building shared or static libraries.
APP_THIN_ARCHIVE
Sets the default value of
LOCAL_THIN_ARCHIVEfor all static library modules in this project. For more information, see the documentation forLOCAL_THIN_ARCHIVEin ANDROID-MK.
A trivial Application.mk file would be:
-------------- cut here -------------------------
APP_PROJECT_PATH := <path to project>
-------------- cut here -------------------------
Android NDK 学习之Application.mk的更多相关文章
- 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 学习之Android.mk
Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk ...
- Android NDK 学习之传递类对象
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- NDK开发之Application.mk文件详解
做过NDK开发的同学应该都知道有个Application.mk文件,这是android NDK构建系统使用的一个可选构建文件.它的目的是描述应用程序需要哪些模块,也定义了所有模块的一些通用变量.主要有 ...
- Android NDK学习记录(一)
一.NDK环境在Mac中部署 1.准备eclipse,android sdk安装包,android ndk安装包(http://dl.google.com/android/ndk/android-nd ...
- Android NDK 学习之在C中抛出异常
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android NDK 学习之调用Java函数
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android NDK 学习之在C中调用Java的变量和静态变量
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
随机推荐
- 迅速解决!!!!!启动Tomcat报错PermGen space
启动Tomcat报错 PermGen space 内存溢出 解决方法:扩大tomcat内存 修改参数:set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSi ...
- Swift4.0复习结构体
1.基本语法: /** 定义了一个结构体 */ struct Structure { /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty = /// ...
- js判断图片加载完成
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...
- python:动态参数*args
动态参数 顾名思义,动态参数就是传入的参数的个数是动态的,可以是1个.2个到任意个,还可以是0个.在不需要的时候,你完全可以忽略动态函数,不用给它传递任何值. Python的动态参数有两种,分别是*a ...
- 窗口、消息查看分析利器Spy++
Spy++ —— 窗口.消息查看分析利器 Spy++ —— 窗口.消息查看分析利器 2016年07月15日 00:25:22 阅读数:23170 1,简介 Microsoft Spy++是一个非常 ...
- Spring的定时任务@Scheduled(cron = "0 0 1 * * *")
指定某个方法在特定时间执行,如: cron="0 0 1 1 * ?" 即这个方法每月1号凌晨1点执行一次 关于这个注解的解释网上一大堆 但是今天遇到个问题,明明加了注解@Sche ...
- python 线程队列PriorityQueue(优先队列)(37)
在 线程队列Queue / 线程队列LifoQueue 文章中分别介绍了先进先出队列Queue和先进后出队列LifoQueue,而今天给大家介绍的是最后一种:优先队列PriorityQueue,对队列 ...
- java端同时获取批量上传图片及其他数据
Controller层: @ResponseBody @RequestMapping(value = "", method = RequestMethod.POST) public ...
- poj3630||hdoj1671(字典树)
题目链接:https://vjudge.net/problem/HDU-1671 题意:给定n个字符串,判断是否存在一些字符串是另一些字符串的前缀. 思路: 套模板,存在前缀可能是两种情况: 当前字符 ...
- [转帖]TPC-C基准测试之链路层优化
TPC-C基准测试之链路层优化 阿里数据库 6000万 TPMC的测试结构. http://www.itpub.net/2019/10/14/3436/ 作者:易鸿伟 闫建良 王光树 在 TPC-C ...