`
jiagou
  • 浏览: 2632272 次
文章分类
社区版块
存档分类
最新评论

NDK Application.mk使用手册

 
阅读更多

本文档从NDK安装目录下的说明文档翻译而来,位置:$NDK/docs/APPLICATION-MK.html

1 概述

Application.mk用来描述你的工程下的native模块, 一般放在$PROJECT/jni/Application.mk, 其中$PROJECT表示你的工程目录,这样就可以被ndk-build脚本文件找到.(注:在这种方式下,进入jni目录,即$PROJECT/jni/,然后执行ndk-build,就可以直接编译jni生成.so文件了).

还有另外一种方法就是将Application.mk文件放在$NDK/app/<myapp>/Application.mk,其中$NDK为NDK的安装目录,<myapp>为你的应用程序名.在这种方式下,进入$NDK安装目录,然后输入make APP=<name>,即可编译你的JNI代码.此种方法是ndk-r4之前的方法,虽然出于兼容的原因目录还支持,但是不建议使用此种方法,因为第一种方法简单,且方便.

在Application.mk文件内定义了一些变量:

APP_PROJECT_PATH

此变量值必须是你工程根目录的绝对路径.这用于指定JNI生成的.so文件安装路径或拷贝路径.

注:此变量对于第一种方法是可选了,但对于第二种方法却是必须的.

APP_MODULES

模块名

此变量是可选的,如果没有在此文件中定义,则默认由Android.mk文件决定.

如果在Application.mk文件中定义此变量,那么它必须是一串由空格相隔的模块名列表,并且与Android.mk文件中的LOCAL_MODULE变量定义保持一致.需要注意地是,NDK会自动计算模块所需要的依赖文件。

注:此变量在NDK R4版本之前是在Application.mk中是必须的,所有模块必须显式地列出.

APP_OPTIM

优化选项

此变量是可选的,其值可以为'release'或'debug'.此变量用来修改优先等级.默认情况下为release.在release模式下,将编译生成被优化了的二进制的机器码,而debug模块用来生成便于调试的未被优化的二进制机器码。

需要注意地是,如果你的程序在manifest文件中的节点下<application>已经设置了android:debuggable属性为"true",则Apllication.mk文件此变量的默认值则为'debug'而不是'release',可以在Application.mk文件中将此变量值设置为'release'而覆盖其值.

虽然在两种模块下都可以调试,但是release模式下提供更少的调试信息,比如:一些变量被优化从而不能被检查,代码重组,及跟踪。

APP_CFLAGS

编译选项

可以在Application.mk文件中修改此编译选项参数,此参数可以覆盖Android.mk文件中的相同定义,从而不必去Android.mk文件中修改.

需要注意地是,这个选项里的路径必须是以顶层NDK目录为相对路径,如存在以下两个文件:

sources/foo/Android.mk

sources/bar/Android.mk

如果在foo/Android.mk文件中想要添加bar目录,那么得这样便用:

APP_CFLAGS += -Isources/bar
如果这样使用:

APP_CFLAGS += -I$(LOCAL_PATH)/../bar
将会变成'-I$NDK_ROOT/../bar',从而出现并不是你想要的结果.

在android-ndk-1.5_r1时,此选项中只在C代码中被支持,而C++不支持,不过现在已经被纠正了.

APP_CXXFLAGS

APP_CPPFLAGS的别名,将来此变量将会被抛弃。

APP_CPPFLAGS

C++代码的编译选项。在android-ndk-1.5_r1版本中,此变量只适用于C++,但是现在可以同时适用于C和C++。

APP_BUILD_SCRIPT

在默认情况下,NDK会在jni目录下查找Android.mk文件并使用它,如果你想修改它,那么在此变量中你可以指定一个你自己的脚本来执行,路径还是以工程顶层目录为相对路径.

APP_ABI

在默认情况下,NDK会使用'armeabi' ABI 来生成二进制机器码,这是基于ARMv5TE的浮点运算CPU,这可以通过使用此变量来选项不同的ABI(Application Binary Interface).


例如:支持基于armv7 FPU指令集的设备:

APP_ABI := armeabi-v7a
支持IA-32指令集:

APP_ABI := x86
同时支持三种:

APP_ABI := armeabi armeabi-v7a x86
从NDK-r7版本后,同时支持三种还可以这样写:

APP_ABI := all
有关ABI更详细的内容请参考文档:docs/CPU-ARCH-ABIS.html

APP_STL

C++标准库

在默认情况下,NDK通过Androoid自带的最小化的C++运行库(system/lib/libstdc++.so)来提供标准C++头文件.然而,NDK提供了可供选择的C++实现,你可以通过此变量来选择使用哪个或链接到你的程序。

APP_STL := stlport_static    --> static STLport library
APP_STL := stlport_shared    --> shared STLport library
APP_STL := system            --> default C++ runtime library
更多详细内容请参考文档docs/CPLUSPLUS-SUPPORT.html。

APP_GNUSTL_FORCE_CPP_FEATURES

在先前的NDK版本中,当使用GNU libstdc++ runtime运行库(通过设置APP_STL变量为gnustl_static或gnustl_shared)都会强制支持异常和RTTI,在有些极少情况下可能会出现问题,同时会使生成的机器码包含不必须的内容。

这种问题在NDK r7b中得到解决,但是这也意味着如果你真的需要支持异常和RTTI 的话,则必须显式声明。要么通过APP_CPPFLAGS,要么通过LOCAL_CPPFLAGS,或LOCAL_CPP_FEATURES。本变量就是为了解决此问题的.

有两个选项供选择,也可同时都选择.

exceptions    -> 强制所有模块支持异常.
rtti          -> 强制所有模块支持rtti.
例如:

APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
注意:此变量是过滤变量,将来有可能不支持.所以建议不使用此变量.







分享到:
评论

相关推荐

    android ndk application.mk

    本篇文章将深入探讨如何使用`application.mk`文件进行NDK编译,以及与之对比的CMake构建系统。 `application.mk`是Android NDK中的一种传统构建系统,它主要用于定义编译参数、链接器选项、依赖库等。这个文件是`...

    Android ndk Android.mk

    这个虽然只是个简单的jnidemo、但是涵盖了Android.mk 和Application.mk 的原理 重点是Android NDK编译的理解 mac 系统下 切换到jni目录,然后呢个 ndk-build

    ndk编译JRTPLIB源文件(包括相应的Android.mk和Application.mk文件)

    ndk编译JRTPLIB源文件(包括相应的Android.mk和Application.mk文件) 使用cygwin+NDK可直接编译通过 相关cygwin命令,文件夹放在c盘上 cd /cygdrive/c/jrtp export NDK_MODULE_PATH=/cygdrive/c/jrtp /cygdrive/c...

    android-sdk-NDK16.1.4479499.rar

    NDK允许开发者使用C和C++语言编写部分应用代码,以提高性能或利用特定硬件功能。在标题"android-sdk-NDK16.1.4479499.rar"中,我们看到的是NDK的一个特定版本,即版本16.1.4479499,它是一个压缩包文件,通常包含了...

    Android NDK开发指南-android.mk文件

    "Android NDK开发指南-android.mk文件" Android NDK 是 Android 操作系统中的一种开发工具,用于使用 C/C++ 语言编写 Android 应用程序。Android.mk 文件是 NDK 中的一个重要组件,用于描述编译系统的配置,使得...

    生成android.mk文件

    `android.mk`文件是Android原生构建系统(NDK)中用于定义模块构建规则的脚本,主要用于C/C++原生库的编译。本篇文章将深入探讨`android.mk`文件的生成及其作用。 **1. android.mk文件简介** `android.mk`文件是...

    android-sdk-NDK21.0.rar

    NDK(Native Development Kit)是另一个关键工具,它允许开发者使用C++和其他原生语言编写部分或全部应用。NDK的主要特点和用途包括: 1. **性能优化**:对于计算密集型任务,如图形处理或物理模拟,原生代码可以...

    android-sdk-NDK18.1.5063045.rar

    Android SDK NDK(Native Development Kit)是Android开发中不可或缺的一部分,它允许开发者使用C和C++编写性能敏感的部分,或者利用已有的C/C++库来构建应用程序。NDK18.1.5063045是Google发布的版本号为18.1的更新...

    android-sdk-NDK17.2.4988734.rar

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android应用开发的工具集,它允许开发者使用C、C++等原生代码编写部分应用程序,从而实现高性能计算和图形处理。这里的"android-sdk-NDK17.2....

    NDK的android.mk文件的详解

    在Android Native Development Kit (NDK)中,`android.mk`文件是用于编译原生C/C++代码的关键构建脚本。这个文件告诉NDK如何处理源代码、链接库和其他资源,以便将它们编译成可供Android应用使用的共享库或静态库。 ...

    安卓NDk 25.1.8937393编译c++gsl库

    安卓NDK 25.1.8937393编译c++gsl库,包括四种架构编译的gsl库:arm64-v8a、armv7、x86、x86_64,编译器使用的是NDK 25.1.8937393

    Android.mk生成工具

    在Android开发领域,Android.mk和Application.mk是两个重要的构建文件,它们主要用于Android Native Development Kit (NDK)编译过程。这两个文件定义了如何构建和链接C/C++原生代码,以便在Android设备上运行。本篇...

    cmake与mk NDK源码.zip

    CMake提供了更强大的功能和灵活性,使得跨平台的构建变得更为简单,而Android.mk和Application.mk则是早期NDK构建的方式,现在已被CMake所取代。在实际开发中,理解并熟练运用CMakeLists.txt的编写,能够有效地提升...

    NdkDemo.rar

    本篇文章将深入探讨NDK的使用,并通过名为“NdkDemo”的实例,详细介绍如何在Android Studio中进行NDK开发。 一、NDK概述 NDK是一组工具集,它允许开发者在Android平台上编译和运行C/C++代码。与Java相比,原生...

    ndk编译ffmpeg0.10(Neon)的android.mk文件

    放在libffmpeg目录下的android.mk文件,根据Scott Wong给出的文档进行了修改,可以直接使用。另外还需要在Libavcodec、libavformat等目录下添加android.mk文件,libavcodec示例如下: LOCAL_PATH := $(call my-dir) ...

    android-sdk-NDK20.0.rar

    Android SDK NDK是一个重要的开发工具,它允许开发者在Android平台上使用C和C++编写原生代码,从而提高应用程序的性能和效率。NDK是Native Development Kit的缩写,它是Google为Android开发者提供的一个补充工具,与...

    Android.mk文件语法规范及使用模板.pdf

    在深入探讨`Android.mk`文件的具体语法规范和使用模板之前,我们先来简要回顾一下`Android.mk`文件的基本概念及其在Android NDK中的作用。`Android.mk`是一种特殊的Makefile,用于向Android NDK描述项目的C/C++源...

    opus NDK 编译 Android.mk文件

    opus NDK 编译 Android.mk文件 仅供参考

    Android NDK翻译之Application

    《Android NDK开发详解:Application.mk》 在深入探讨Android NDK开发时,Application.mk文件起着至关重要的作用。它是构建本地C/C++模块时的一个配置文件,用于定义应用程序对本地.so库的需求。理解并有效地使用...

    Android.mk用法介绍

    NDK编译系统将自动处理这些问题,使得升级NDK后,不需要改变Android.mk文件。 一个简单的Android.mk文件示例: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= helloworld LOCAL_SRC_FILES :...

Global site tag (gtag.js) - Google Analytics