`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](OVERVIEW.html) file that explains their role and usage. Readers of this document should have read [OVERVIEW](OVERVIEW.html) and [ANDROID-MK](ANDROID-MK.html). 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 <myapp> 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-build` to 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 the > LOCAL_MODULE definition of Android.mk files. > > It the variable is undefined, `ndk-build` looks 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-build` will build all top-level > static libraries and their dependencies instead. However, these > libraries will be placed at the usual location under `obj/` or > `obj-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:debuggable` attribute to "`true`" in its `<application>` > tag), the default will be 'debug' instead of 'release'. This can > be overridden by setting APP_OPTIM to '`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_CFLAGS for 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_SCRIPT > to 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 use APP_ABI to 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 Intel64 instruction set, use: APP_ABI := x86-64 > 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 x86-64 > 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](CPU-ARCH-ABIS.html). - - - - 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, read [STABLE-APIS](STABLE-APIS.html). - - - - 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_STL to 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](CPLUSPLUS-SUPPORT.html). - - - - APP_GNUSTL_FORCE_CPP_FEATURES > In prior NDK versions, the simple fact of using the GNU libstdc++ > runtime (i.e. by setting APP_STL to 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 your LOCAL_CPPFLAGS / LOCAL_CPP_FEATURES definitions. > > To make it easier to port projects to NDK r7b and later, one can > optionally defined APP_GNUSTL_CPP_FEATURES to 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_COMMANDS for your whole project. See the > documentation for this variable in [ANDROID-MK](ANDROID-MK.html). - - - - NDK_TOOLCHAIN_VERSION > Define this variable to either 4.6, 4.7 or 4.8 to select version of > the 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-build` will automatically set this value to '`true`' if > your project targets `android-16` or 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_ARCHIVE for all static library > modules in this project. For more information, see the documentation > for LOCAL_THIN_ARCHIVE in [ANDROID-MK](ANDROID-MK.html). - - - - A trivial `Application.mk` file would be: -------------- cut here ------------------------- APP_PROJECT_PATH := <path to project> -------------- cut here -------------------------