summaryrefslogtreecommitdiffstats
path: root/docs/html/ndk/guides/android_mk.jd
diff options
context:
space:
mode:
Diffstat (limited to 'docs/html/ndk/guides/android_mk.jd')
-rw-r--r--docs/html/ndk/guides/android_mk.jd875
1 files changed, 875 insertions, 0 deletions
diff --git a/docs/html/ndk/guides/android_mk.jd b/docs/html/ndk/guides/android_mk.jd
new file mode 100644
index 0000000..47fefc3
--- /dev/null
+++ b/docs/html/ndk/guides/android_mk.jd
@@ -0,0 +1,875 @@
+page.title=Android.mk
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>On this page</h2>
+
+ <ol>
+ <li><a href="#over">Overview</a></li>
+ <li><a href="#basics">Basics</a></li>
+ <li><a href="#var">Variables and Macros</a></li>
+ <li><a href="#mdv">Module-Description Variables</a></li>
+ </ol>
+ </div>
+ </div>
+
+
+<p>This page describes the syntax of the {@code Android.mk} build file,
+which glues your C and C++ source files to the Android NDK.</p>
+
+<h2 id="over">Overview</h2>
+<p>The {@code Android.mk} file resides in a subdirectory of your project's {@code jni/} directory,
+and describes your sources and shared libraries to the build system. It is really a tiny GNU
+makefile fragment that the build system parses once or more. The {@code Android.mk} file is useful
+for defining project-wide settings that <a href="{@docRoot}ndk/guides/application_mk.html">{@code
+Application.mk}</a>, the build system, and your
+environment variables leave undefined. It can also override project-wide settings for specific
+<i>modules</i>.</p>
+
+<p>The syntax of the {@code Android.mk} allows you to group your sources into
+<em>modules</em>. A module is either a static library, a shared library, or a standalone
+executable. You can define one or more modules in each {@code Android.mk} file, and
+you can use the same source file in multiple modules. The build system only places shared libraries
+into your application package. In addition, static libraries can generate shared libraries.</p>
+
+<p>In addition to packaging libraries, the build system handles a variety of other details for you.
+For example, you don't need to list header files or explicit dependencies between generated files in
+your {@code Android.mk} file. The NDK build system computes these relationships automatically for
+you. As a result, you should be able to benefit from new toolchain/platform support in future NDK
+releases without having to touch your {@code Android.mk} file.</p>
+
+<p>The syntax of this file is very close to that used in the {@code Android.mk} files distributed with
+the full <a href="https://source.android.com">Android Open Source Project</a>. While the
+build system implementation that uses them is different, their similarity is an
+intentional design decision aimed at making it easier for application
+developers to reuse source code for external libraries.</p>
+
+<h2 id="basics">Basics</h2>
+<p>Before exploring the syntax in detail, it is useful to start by understanding the basics
+of what a {@code Android.mk} file contains. This section uses the {@code Android.mk} file in the
+Hello-JNI sample toward that end, explaining the role that each line in the file plays.</p>
+
+
+<p>An {@code Android.mk} file must begin by defining the {@code LOCAL_PATH} variable:
+
+<pre class="no-pretty-print">
+LOCAL_PATH := $(call my-dir)
+</pre>
+
+<p>This variable indicates the location of the source files in the development tree. Here, the macro
+function {@code my-dir}, provided by the build system, returns the path of the current directory
+(the directory containing the {@code Android.mk} file itself).</p>
+
+<p>The next line declares the {@code CLEAR_VARS} variable, whose value the build system provides.
+
+<pre class="no-pretty-print">
+include $(CLEAR_VARS)
+</pre>
+
+<p>The {@code CLEAR_VARS} variable points to a special GNU Makefile that clears many
+{@code LOCAL_XXX} variables for you, such as {@code LOCAL_MODULE}, {@code LOCAL_SRC_FILES}, and
+{@code LOCAL_STATIC_LIBRARIES}. Note that it does not clear {@code LOCAL_PATH}. This variable must
+retain its value because the system parses all build control files in a single GNU Make execution
+context where all variables are global. You must (re-)declare this variable before describing each
+module.</p>
+
+<p>Next, the {@code LOCAL_MODULE} variable stores the name of the module that you wish to build.
+Use this variable once per module in your application.</p>
+
+<pre class="no-pretty-print">
+LOCAL_MODULE := hello-jni
+</pre>
+
+<p>Each module name must be unique and not contain any spaces. The build system, when it
+generates the final shared-library file, automatically adds the proper prefix and suffix to
+the name that you assign to {@code LOCAL_MODULE}. For example, the example that appears above
+results in generation of a library called {@code libhello-jni.so}.</p>
+
+<p class="note"><strong>Note:</strong> If your module's name already starts with {@code lib}, the
+build system does not prepend an additional {@code lib} prefix; it takes the module name as-is, and
+adds the {@code .so} extension. So a source file originally called, for example, {@code libfoo.c}
+still produces a shared-object file called {@code libfoo.so}. This behavior is to support libraries
+that the Android platform sources generate from {@code Android.mk} files; the names of all such
+libraries start with {@code lib}.</p>
+
+<p>The next line enumerates the source files, with spaces delimiting multiple files:</p>
+
+<pre class="no-pretty-print">
+LOCAL_SRC_FILES := hello-jni.c
+</pre>
+
+<p>The {@code LOCAL_SRC_FILES} variable must contain a list of C and/or C++ source files to build
+into a module.</p>
+
+<p>The last line helps the system tie everything together:</p>
+
+<pre class="no-pretty-print">
+include $(BUILD_SHARED_LIBRARY)
+</pre>
+
+<p>The {@code BUILD_SHARED_LIBRARY} variable points to a GNU Makefile script that collects all the
+information you defined in {@code LOCAL_XXX} variables since the most recent {@code include}. This
+script determines what to build, and how to do it.</p>
+
+<p>There are more complex examples in the samples directories, with commented
+{@code Android.mk} files that you can look at. In addition,
+<a href="{@docRoot}ndk/samples/sample_na.html">Sample: native-activity</a> provides
+a detailed explanation of that sample's {@code Android.mk} file. Finally, <a href="#var">
+Variables and Macros</a> provides further information on the variables from this section.
+
+
+<h2 id="var">Variables and Macros</h2>
+<p>The build system provides many possible variables for use in the the {@code Android.mk} file.
+Many of these variables come with preassigned values. Others, you assign.</p>
+
+<p>In addition to these variables, you can also define your own arbitrary ones. If you do so, keep
+in mind that the NDK build system reserves the following variable names:</p>
+<ul>
+<li>Names that begin with {@code LOCAL_}, such as {@code LOCAL_MODULE}.</li>
+<li>Names that begin with {@code PRIVATE_}, {@code NDK_}, or {@code APP}. The build system uses
+these internally.</li>
+<li>Lower-case names, such as {@code my-dir}. The build system uses these internally, as well.</li>
+</ul>
+<p>If you need to define your own convenience variables in an {@code Android.mk} file, we
+recommend prepending {@code MY_} to their names.
+
+
+<h3 id="npv">NDK-defined variables</h3>
+<p>This section discusses the GNU Make variables that the build system defines before parsing your
+{@code Android.mk} file. Under certain circumstances, the NDK might parse your {@code Android.mk}
+file several times, using a different definition for some of these variables each time.</p>
+
+<h4>CLEAR_VARS</h4>
+<p>This variable points to a build script that undefines nearly all {@code LOCAL_XXX} variables
+listed in the "Developer-defined variables" section below. Use this variable to include
+this script before describing a new module. The syntax for using it is:</p>
+
+<pre class="no-pretty-print">
+include $(CLEAR_VARS)
+</pre>
+
+<h4>BUILD_SHARED_LIBRARY</h4>
+<p>This variable points to a build script that collects all the information about the module
+you provided in your {@code LOCAL_XXX} variables, and determines how to build a target shared
+library from the sources you listed. Note that using this script requires that you have already
+assigned values to {@code LOCAL_MODULE} and {@code LOCAL_SRC_FILES}, at a minimum (for more
+information about these variables, see <a href = "#mdv">Module-Description Variables</a>).</p>
+
+<p>The syntax for using this variable is:</p>
+
+<pre class="no-pretty-print">
+include $(BUILD_SHARED_LIBRARY)
+</pre>
+
+<p>A shared-library variable causes the build system to generate a library file with a {@code .so}
+extension.</p>
+
+<h4>BUILD_STATIC_LIBRARY</h4>
+<p>A variant of {@code BUILD_SHARED_LIBRARY} that is used to build a static library. The build
+system does not copy static libraries into your project/packages, but it can use them to build
+shared libraries (see {@code LOCAL_STATIC_LIBRARIES} and {@code LOCAL_WHOLE_STATIC_LIBRARIES},
+below). The syntax for using this variable is:</p>
+
+<pre class="no-pretty-print">
+include $(BUILD_STATIC_LIBRARY)
+</pre>
+
+<p>A static-library variable causes the build system to generate a library with a {@code .a}
+extension.</p>
+
+<h4>PREBUILT_SHARED_LIBRARY</h4>
+<p>Points to a build script used to specify a prebuilt shared library. Unlike in the case of
+{@code BUILD_SHARED_LIBRARY} and {@code BUILD_STATIC_LIBRARY}, here the value of
+{@code LOCAL_SRC_FILES} cannot be a source file. Instead, it must be a single path to a prebuilt
+shared library, such as {@code foo/libfoo.so}. The syntax for using this variable is:</p>
+
+<pre class="no-pretty-print">
+include $(PREBUILT_SHARED_LIBRARY)
+</pre>
+
+<p>You can also reference a prebuilt library in another module by using the
+{@code LOCAL_PREBUILTS} variable. For more information about using prebuilts, see
+<a href="{@docRoot}ndk/guides/prebuilts.html">Using Prebuilt Libraries</a>.</p>
+
+
+<h4>PREBUILT_STATIC_LIBRARY</h4>
+<p>The same as {@code PREBUILT_SHARED_LIBRARY}, but for a prebuilt static library. For more
+information about using prebuilts, see <a href="{@docRoot}ndk/guides/prebuilts.html">Using Prebuilt
+Libraries</a>.</p>
+
+<h4>TARGET_ARCH</h4>
+<p>The name of the target CPU architecture as the Android Open Source Project specifies it.
+For any ARM-compatible build, use {@code arm}, independent of the CPU architecture revision or
+ABI (see TARGET_ARCH_ABI, below).</p>
+
+<p>The value of this variable is taken from the APP_ABI variable that you define in the
+{@code Android.mk} file, which the system reads ahead of parsing the {@code Android.mk} file.</p>
+
+<h4>TARGET_PLATFORM</h4>
+<p>The Android API level number for the build system to target.
+For example, the Android 5.1 system images correspond to Android API level 22: {@code android-22}.
+For a complete list of platform names and corresponding Android system
+images, see <a href="{@docRoot}ndk/guides/stable_apis.html">Android NDK Native APIs</a>.
+The following example shows the syntax for using this variable:</p>
+
+<pre class="no-pretty-print">
+TARGET_PLATFORM := android-22
+</pre>
+
+<h4 id="taa">TARGET_ARCH_ABI</h4>
+<p>This variable stores the name of the CPU and architecture to target when the build system
+parses this {@code Android.mk} file. You can specify one or more of the following values, using
+a space as a delimiter between multiple targets. Table 1 shows the ABI setting to use for each
+supported CPU and architecture.
+
+<p class="table-caption" id="table1">
+ <strong>Table 1.</strong> ABI settings for different CPUs and architectures.</p>
+<table>
+ <tr>
+ <th scope="col">CPU and architecture</th>
+ <th scope="col">Setting</th>
+ </tr>
+ <tr>
+ <td>ARMv5TE</td>
+ <td>{@code armeabi}</td>
+ </tr>
+ <tr>
+ <td>ARMv7</td>
+ <td>{@code armeabi-v7a}</td>
+ </tr>
+ <tr>
+ <td>ARMv8 AArch64</td>
+ <td>{@code arm64-v8a}</td>
+ </tr>
+ <tr>
+ <td>i686</td>
+ <td>{@code x86}</td>
+ </tr>
+ <tr>
+ <td>x86-64</td>
+ <td>{@code x86_64}</td>
+ </tr>
+ <tr>
+ <td>mips32 (r1)</td>
+ <td>{@code mips}</td>
+ </tr>
+ <tr>
+ <td>mips64 (r6)</td>
+ <td>{@code mips64}</td>
+ </tr>
+ <tr>
+ <td>All</td>
+ <td>{@code all}</td>
+ </tr>
+</table>
+
+<p>The following example shows how to set ARMv8 AArch64 as the target CPU-and-ABI combination:</p>
+
+<pre class="no-pretty-print">
+TARGET_ARCH_ABI := arm64-v8a
+</pre>
+
+<p class="note"><strong>Note: </strong> Up to Android NDK 1.6_r1, this variable is defined as
+{@code arm}.</p>
+
+<p>For more details about architecture ABIs and associated compatibility
+issues, refer to
+<a href="{@docRoot}ndk/guides/abis.html">ABI Management</a>.</p>
+
+<p>New target ABIs in the future will have different values.</p>
+
+<h4>TARGET_ABI</h4>
+<p>A concatenation of target Android API level and ABI, it is especially useful when you want to test against
+a specific target system image for a real device. For example, to specify a 64-bit ARM device
+running on Android API level 22:</p>
+
+<pre class="no-pretty-print">
+TARGET_ABI := android-22-arm64-v8a
+</pre>
+
+<p class="note"><strong>Note:</strong> Up to Android NDK 1.6_r1, the default value was
+{@code android-3-arm}.</p>
+
+<h2 id="mdv">Module-Description Variables</h2>
+<p>The variables in this section describe your module to the build system. Each module description
+should follow this basic flow:
+<ul>
+<ol type = "1">
+<li>Initialize or undefine the variables associated with the module, using the {@code CLEAR_VARS}
+ variable.</li>
+<li>Assign values to the variables used to describe the module.
+<li>Set the NDK build system to use the appropriate build script for the module, using the
+ {@code BUILD_XXX} variable.</li>
+</ol>
+</ul>
+
+<h4>LOCAL_PATH</h4>
+<p>This variable is used to give the path of the current file. You must define
+it at the start of your {@code Android.mk} file. The following example shows how to do so:</p>
+
+<pre class="no-pretty-print">
+LOCAL_PATH := $(call my-dir)
+</pre>
+
+<p>The script to which {@code CLEAR_VARS} points does not clear this variable. Therefore, you only need
+to define it a single time, even if your {@code Android.mk} file describes multiple modules.</p>
+
+<h4>LOCAL_MODULE</h4>
+<p>This variable stores the name of your module. It must be unique among all module names,
+and must not contain any spaces. You must define it before including any scripts (other than
+the one for {@code CLEAR_VARS}). You need not add either the {@code lib} prefix
+or the {@code .so} or {@code .a} file extension; the build system makes these modifications
+automatically. Throughout your {@code Android.mk} and
+<a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> files, refer to
+your module by its unmodified name. For example, the following line results in the generation of a
+shared library module called {@code libfoo.so}:</p>
+
+<pre class="no-pretty-print">
+LOCAL_MODULE := "foo"
+</pre>
+
+<p>If you want the generated module to have a name other than {@code lib} + the value of
+{@code LOCAL_MODULE}, you can use the {@code LOCAL_MODULE_FILENAME} variable to give the
+generated module a name of your own choosing, instead.</p>
+
+<h4>LOCAL_MODULE_FILENAME</h4>
+<p>This optional variable allows you to override the names that the build system
+uses by default for files that it generates. For example, if the name of your {@code LOCAL_MODULE}
+is {@code foo}, you can force the system to call the file it generates {@code libnewfoo}. The
+following example shows how to accomplish this:</p>
+
+<pre class="no-pretty-print">
+LOCAL_MODULE := foo
+LOCAL_MODULE_FILENAME := libnewfoo
+</pre>
+
+<p>For a shared library module, this example would generate a file called {@code libnewfoo.so}.</p>
+
+<p class="note"><strong>Note:</strong> You cannot override filepath or file extension.</p>
+
+<h4>LOCAL_SRC_FILES</h4>
+<p>This variable contains the list of source files that the build system uses to generate the
+module. Only list the files that the build system actually passes to the compiler, since the build
+system automatically computes any associated depencies.</p>
+<p>Note that you can use both relative (to {@code LOCAL_PATH}) and absolute file paths.
+
+<p>We recommend avoiding absolute file paths; relative paths make your {@code Android.mk} file more
+portable.</p>
+
+<p class="note"><strong>Note: </strong> Always use Unix-style forward slashes (/) in build files.
+The build system does not handle Windows-style backslashes (\) properly.</p>
+
+<h4>LOCAL_CPP_EXTENSION</h4>
+<p>You can use this optional variable to indicate a file extension other than {@code .cpp} for your
+C++ source files. For example, the following line changes the extension to {@code .cxx}.
+(The setting must include the dot.)
+
+<pre class="no-pretty-print">
+LOCAL_CPP_EXTENSION := .cxx
+</pre>
+
+<p>From NDK r7, you can use this variable to specify multiple extensions. For instance:</p>
+
+<pre class="no-pretty-print">
+LOCAL_CPP_EXTENSION := .cxx .cpp .cc
+</pre>
+
+<h4>LOCAL_CPP_FEATURES</h4>
+
+<p>You can use this optional variable to indicate that your code relies on specific C++ features.
+It enables the right compiler and linker flags during the build process. For prebuilt binaries,
+this variable also declares which features the binary depends on, thus helping ensure the final
+linking works correctly. We recommend that you use this variable instead of enabling
+{@code -frtti} and {@code -fexceptions} directly in your {@code LOCAL_CPPFLAGS} definition.</p>
+
+<p>Using this variable allows the build system to use the appropriate flags for each module. Using
+{@code LOCAL_CPPFLAGS} causes the compiler to use all specified flags for all modules, regardless
+of actual need.</p>
+
+For example, to indicate that your code uses RTTI (RunTime Type Information), write: </p>
+
+<pre class="no-pretty-print">
+LOCAL_CPP_FEATURES := rtti
+</pre>
+
+<p>To indicate that your code uses C++ exceptions, write:</p>
+
+<pre class="no-pretty-print">
+LOCAL_CPP_FEATURES := exceptions
+</pre>
+
+<p>You can also specify multiple values for this variable. For example:</p>
+
+<pre class="no-pretty-print">
+LOCAL_CPP_FEATURES := rtti features
+</pre>
+
+The order in which you describe the values does not matter.
+
+
+<h4>LOCAL_C_INCLUDES</h4>
+<p>You can use this optional variable to specify a list of paths, relative to the
+NDK {@code root} directory, to add to the include search path when compiling all sources
+(C, C++ and Assembly). For example: </p>
+
+<pre class="no-pretty-print">
+LOCAL_C_INCLUDES := sources/foo
+</pre>
+
+<p>Or even: </p>
+
+<pre class="no-pretty-print">
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
+</pre>
+
+<p>Define this variable before setting any corresponding inclusion flags via {@code LOCAL_CFLAGS}
+or {@code LOCAL_CPPFLAGS}.</p>
+
+<p>The build system also uses {@code LOCAL_C_INCLUDES} paths automatically when launching native
+debugging with ndk-gdb.</p>
+
+
+<h4>LOCAL_CFLAGS</h4>
+
+<p>This optional variable sets compiler flags for the build system to pass when building C
+<em>and</em> C++ source files. The ability to do so can be useful for specifying additional macro
+definitions or compile options.</p>
+
+<p>Try not to change the optimization/debugging level in your {@code Android.mk} file.
+The build system can handle this setting automatically for you, using the relevant information
+in the <a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file. Doing it
+this way allows the build system to generate useful data files used during debugging.</p>
+
+<p class="note"><strong>Note: </strong>In android-ndk-1.5_r1, the corresponding flags only applied
+to C source files, not C++ ones. They now match the full Android build system behavior.
+(You can now use {@code LOCAL_CPPFLAGS} to specify flags for C++ sources only.)</p>
+
+<p>It is possible to specify additional include paths by writing:
+
+<pre class="no-pretty-print">
+LOCAL_CFLAGS += -I&lt;path&gt;,
+</pre>
+
+It is better, however, to use {@code LOCAL_C_INCLUDES} for this purpose, since
+doing so also makes it possible to use the paths available for native debugging with ndk-gdb.</p>
+
+
+<h4>LOCAL_CPPFLAGS</h4>
+<p>An optional set of compiler flags that will be passed when building C++
+source files <em>only</em>. They will appear after the LOCAL_CFLAGS on the
+compiler's command-line.</p>
+
+
+<p class="note"><strong>Note: </strong>In android-ndk-1.5_r1, the corresponding flags applied to
+both C and C++ sources. This has been corrected to match the full Android build system.
+To specify flags for both C and C++ sources, use {@code LOCAL_CFLAGS}.</p>
+
+
+<h4>LOCAL_STATIC_LIBRARIES</h4>
+
+<p>This variable stores the list of static libraries modules on which the current module depends.</p>
+
+<p>If the current module is a shared library or an executable, this variable will force
+these libraries to be linked into the resulting binary.</p>
+
+<p>If the current module is a static library, this variable simply indicates that other
+modules depending on the current one will also depend on the listed
+libraries.</p>
+
+<h4>LOCAL_SHARED_LIBRARIES</h4>
+
+<p>This variable is the list of shared libraries <em>modules</em> on which this module depends at
+runtime. This information is necessary at link time, and to embed the corresponding information
+in the generated file.</p>
+
+<h4>LOCAL_WHOLE_STATIC_LIBRARIES</h4>
+<p>This variable is a variant of {@code LOCAL_STATIC_LIBRARIES}, and expresses that the linker
+should treat the associated library modules as <em>whole archives</em>. For more information
+on whole archives, see the GNU linker's
+<a href="http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html">documentation</a> for the
+{@code --whole-archive} flag.</p>
+
+<p>This variable is useful when there are circular dependencies among
+several static libraries. When you use this variable to build a shared library, it will force
+the build system to add all object files from your static libraries to the final binary. The same
+is not true, however, when generating executables.</p>
+
+
+<h4>LOCAL_LDLIBS</h4>
+
+<p>This variable contains the list of additional linker flags for use in building your shared
+library or executable. It enables you to use the {@code -l} prefix to pass the name of specific
+system libraries. For example, the following example tells the linker to generate a module that
+links to {@code /system/lib/libz.so} at load time: </p>
+
+<pre class="no-pretty-print">
+LOCAL_LDLIBS := -lz
+</pre>
+
+<p>For the list of exposed system libraries against which you can link in this NDK release, see
+<a href="stable_apis.html">Android NDK Native APIs</a>.</p>
+
+<p class="note"><strong>Note: </strong> If you define this variable for a static library,
+the build system ignores it, and {@code ndk-build} prints a warning.</p>
+
+<h4>LOCAL_LDFLAGS</h4>
+
+<p>The list of other linker flags for the build system to use when building your shared library
+or executable. For example, the following example uses the {@code ld.bfd} linker on ARM/X86 GCC
+4.6+, on which {@code ld.gold} is the default </p>
+
+<pre class="no-pretty-print">
+LOCAL_LDFLAGS += -fuse-ld=bfd
+</pre>
+
+<p class="note"><strong>Note: </strong>If you define this variable for a static library, the build
+system ignores it, and ndk-build prints a warning.</p>
+
+<h4>LOCAL_ALLOW_UNDEFINED_SYMBOLS</h4>
+
+<p>By default, when the build system encounters an undefined reference encountered while trying to
+build a shared, it will throw an <em>undefined symbol</em> error. This error can help you catch
+catch bugs in your source code.</p>
+
+<p>To disable this check, set this variable to {@code true}. Note that this setting may cause the
+shared library to load at runtime.</p>
+
+<p class="note"><strong>Note: </strong> If you define this variable for a static library,
+the build system ignores it, and ndk-build prints a warning.</p>
+
+<h4>LOCAL_ARM_MODE</h4
+>
+<p>By default, the build system generates ARM target binaries in <em>thumb</em> mode, where each
+instruction is 16 bits wide and linked with the STL libraries in the {@code thumb/} directory.
+Defining this variable as {@code arm} forces the build system to generate the module's object
+files in 32-bit {@code arm} mode. The following example shows how to do this:</p>
+
+<pre class="no-pretty-print">
+LOCAL_ARM_MODE := arm
+</pre>
+
+<p>You can also instruct the build system to only build specific sources in {@code arm} mode by
+appending {@code .arm} suffix to the the source filenames. For example, the following example
+tells the build system to always compile {@code bar.c} in ARM mode, but to build
+{@code foo.c} according to the value of {@code LOCAL_ARM_MODE}.</p>
+
+<pre class="no-pretty-print">
+LOCAL_SRC_FILES := foo.c bar.c.arm
+</pre>
+
+<p></p>
+
+<p class="note"><strong>Note: </strong> You can also force the build system to generate ARM binaries
+by setting {@code APP_OPTIM} in your
+<a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file to {@code debug}.
+Specifying {@code debug} forces an ARM build because the toolchain debugger does not handle Thumb
+code properly.</p>
+
+
+<h4>LOCAL_ARM_NEON</h4>
+<p>This variable only matters when you are targeting the {@code armeabi-v7a} ABI. It allows the
+use of ARM Advanced SIMD (NEON) GCC intrinsics in your C and C++ sources, as well as NEON
+instructions in Assembly files.</p>
+
+<p>Note that not all ARMv7-based CPUs support the NEON instruction set extensions. For this reason,
+you must perform runtime detection to be able to safely use this code at runtime. For more
+information, see <a href="{@docRoot}ndk/guides/cpu-arm-neon.html">NEON Support</a> and <a
+href="{@docRoot}ndk/guides/cpu-features.html">The {@code cpufeatures} Library</a>.</p>
+
+<p>Alternatively, you can use the {@code .neon} suffix to specify that the build system only
+compile specific source files with NEON support. In the following example, the build system compiles
+{@code foo.c} with thumb and neon support, {@code bar.c} with thumb support, and
+{@code zoo.c} with support for ARM and NEON:</p>
+
+<pre class="no-pretty-print">
+LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
+</pre>
+
+
+<p>If you use both suffixes, {@code .arm} must precede {@code .neon}.</p>
+
+<h4>LOCAL_DISABLE_NO_EXECUTE</h4>
+
+<p>Android NDK r4 added support for the "NX bit" security feature. It is
+enabled by default, but you can disable it by setting this variable to {@code true}. We do not
+recommend doing so without a compelling reason.</p>
+
+<p>This feature does not modify the ABI, and is only enabled on kernels
+targeting ARMv6+ CPU devices. Machine code with this feature enabled
+will run unmodified on devices running earlier CPU architectures.</p>
+<p>For more information, see <a href="http://en.wikipedia.org/wiki/NX_bit">Wikipedia: NX bit</a>
+and <a href="http://www.gentoo.org/proj/en/hardened/gnu-stack.xml">The GNU stack kickstart</a>.
+
+<h4>LOCAL_DISABLE_RELRO</h4>
+
+<p>By default, the NDK compiles code with read-only relocations and GOT
+protection. This variable instructs the runtime linker to mark certain regions of memory
+as read-only after relocation, making certain security exploits (such as GOT overwrites)
+more difficult. Note that these protections are only effective on Android API level 16 and higher.
+On lower API levels, the code will still run, but without memory protections.</p>
+
+<p>This variable is turned on by default, but you can disable it by setting its value to
+{@code true}. We do not recommend doing so without a compelling reason.</p>
+
+<p>For more information, see
+<a href="http://isisblogs.poly.edu/2011/06/01/relro-relocation-read-only/">RELRO:
+RELocation Read-Only</a> and <a href="http://www.akkadia.org/drepper/nonselsec.pdf">Security
+enhancements in RedHat Enterprise Linux (section 6)</a>.</p>
+
+<h4>LOCAL_DISABLE_FORMAT_STRING_CHECKS</h4>
+
+<p>By default, the build system compiles code with format string protection. Doing so forces a
+compiler error if a non-constant format string is used in a {@code printf}-style function.</p>
+<p>This protection is on by default, but you can disable it by setting the value of
+this variable to {@code true}. We do not recommend doing so without a compelling reason.</p>
+
+
+<h4>LOCAL_EXPORT_CFLAGS</h4>
+
+<p>This variable records a set of C/C++ compiler flags to add to the {@code LOCAL_CFLAGS} definition
+of any other module that uses this one via the {@code LOCAL_STATIC_LIBRARIES} or
+{@code LOCAL_SHARED_LIBRARIES} variables.</p>
+
+<p>For example, consider the following pair of modules: {@code foo} and {@code bar}, which depends
+on {@code foo}:</p>
+
+<pre class="no-pretty-print">
+include $(CLEAR_VARS)
+LOCAL_MODULE := foo
+LOCAL_SRC_FILES := foo/foo.c
+LOCAL_EXPORT_CFLAGS := -DFOO=1
+include $(BUILD_STATIC_LIBRARY)
+
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := bar
+LOCAL_SRC_FILES := bar.c
+LOCAL_CFLAGS := -DBAR=2
+LOCAL_STATIC_LIBRARIES := foo
+include $(BUILD_SHARED_LIBRARY)
+</pre>
+
+<p>Here, the build system passes the flags {@code -DFOO=1} and {@code -DBAR=2} to the compiler when
+building {@code bar.c}. It also prepends exported flags to your your module's {@code LOCAL_CFLAGS}
+so you can easily override them.</p>
+
+In addition, the relationship among modules is transitive: If {@code zoo} depends on
+{@code bar}, which in turn depends on {@code foo}, then {@code zoo} also inherits all flags
+exported from {@code foo}.</p>
+
+<p>Finally, the build system does not use exported flags when building locally (i.e., building the
+module whose flags it is exporting). Thus, in the example above, it does not pass {@code -DFOO=1}
+to the compiler when building {@code foo/foo.c}. To build locally, use {@code LOCAL_CFLAGS}
+instead.</p>
+
+<h4>LOCAL_EXPORT_CPPFLAGS</h4>
+<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, but for C++ flags only.</p>
+
+<h4>LOCAL_EXPORT_C_INCLUDES</h4>
+<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, but for C include paths. It is useful
+in cases where, for example, {@code bar.c} needs to include headers from module {@code foo}.</p>
+
+<h4>LOCAL_EXPORT_LDFLAGS</h4>
+<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, but for linker flags.</p>
+
+<h4>LOCAL_EXPORT_LDLIBS</h4>
+<p>This variable is the same as {@code LOCAL_EXPORT_CFLAGS}, telling the build system to pass names
+of specific system libraries to the compiler. Prepend {@code -l} to the name of each library you
+specify.</p>
+
+<p>Note that the build system appends imported linker flags to the value of your module's
+{@code LOCAL_LDLIBS} variable. It does this due to the way Unix linkers work.</p>
+
+<p>This variable is typically useful when module {@code foo} is a static library
+and has code that depends on a system library. You can then use {@code LOCAL_EXPORT_LDLIBS} to
+to export the dependency. For example: </p>
+
+<pre class="no-pretty-print">
+include $(CLEAR_VARS)
+LOCAL_MODULE := foo
+LOCAL_SRC_FILES := foo/foo.c
+LOCAL_EXPORT_LDLIBS := -llog
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := bar
+LOCAL_SRC_FILES := bar.c
+LOCAL_STATIC_LIBRARIES := foo
+include $(BUILD_SHARED_LIBRARY)
+</pre>
+
+<p>In this example, the build system puts {@code -llog} at the end of the linker command when it
+builds {@code libbar.so}. Doing so tells the linker that, because {@code libbar.so} depends
+on {@code foo}, it also depends on the system logging library.</p>
+
+<h4>LOCAL_SHORT_COMMANDS</h4>
+<p>Set this variable to {@code true} when your module has a very high
+number of sources and/or dependent static or shared libraries. Doing so forces the
+build system to use {@code @} syntax for archives containing intermediate object files
+or linking libraries.</p>
+
+<p>This feature can be useful on Windows, where the command line accepts a maximum of only
+of 8191 characters, which can be too small for complex projects. It also impacts the compilation of
+individual source files, placing nearly all compiler flags inside list files, too.</p>
+
+<p>Note that any value other than {@code true} will revert to the
+default behaviour. You can also define {@code APP_SHORT_COMMANDS} in your
+<a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file to force this
+behavior for all modules in your project.</p>
+
+<p>We do not recommend enabling this feature by default, since it makes the build slower.</p>
+
+
+<h4>LOCAL_THIN_ARCHIVE</h4>
+
+<p>Set this variable to {@code true} when building static libraries.
+Doing so will generate a <strong>thin archive</strong>, a library file that does not contain
+object files, but instead just file paths to the actual objects that it would normally
+contain.</p>
+<p>This is useful to reduce the size of your build output. The drawback is that
+such libraries <em>cannot</em> be moved to a different location (all paths
+inside them are relative).</p>
+<p>Valid values are {@code true}, {@code false} or empty. A
+default value can be set in your <a href="{@docRoot}ndk/guides/application_mk.html">
+{@code Application.mk}</a> file through the {@code APP_THIN_ARCHIVE}
+
+variable.</p>
+<p class="note"><strong>Note:</strong> This is ignored for non-static library modules, or prebuilt
+static library ones.</p>
+
+<h4>LOCAL_FILTER_ASM</h4>
+<p>Define this variable as a shell command that the build system will use to filter the
+assembly files extracted or generated from the files you specified for {@code LOCAL_SRC_FILES}.</p>
+<p>Defining this variable causes the following things to occur:</p>
+
+<ul>
+<ol type = "1">
+<li>The build system generates a temporary assembly file from any C or C++ source file, instead of compiling them into an object file.</li>
+<li>The build system executes the shell command in {@code LOCAL_FILTER_ASM}
+on any temporary assembly file and on any assembly file
+listed in {@code LOCAL_SRC_FILES}, thus generating another temporary assembly
+file.</li>
+<li>The build system compiles these filtered assembly files into an object file.</li>
+</ol>
+</ul>
+<p>For example:</p>
+
+<pre class="no-pretty-print">
+LOCAL_SRC_FILES := foo.c bar.S
+LOCAL_FILTER_ASM :=
+
+foo.c --1--&gt; $OBJS_DIR/foo.S.original --2--&gt; $OBJS_DIR/foo.S --3--&gt; $OBJS_DIR/foo.o
+bar.S --2--&gt; $OBJS_DIR/bar.S --3--&gt; $OBJS_DIR/bar.o
+</pre>
+
+<p>"1" corresponds to the compiler, "2" to the filter, and "3" to the assembler. The filter must
+be a standalone shell command that takes the name of the input file as its first argument, and the
+name of the output file as the second one. For example:</p>
+
+<pre class="no-pretty-print">
+myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
+myasmfilter bar.S $OBJS_DIR/bar.S
+</pre>
+
+<h3 id="npfm">NDK-provided function macros</h2>
+<p>This section explains GNU Make function macros that the NDK provides. Use
+{@code $(call &lt;function&gt;)} to evaluate them; they return textual information.</p>
+
+<h4>my-dir</h4>
+
+<p>This macro returns the path of the last included makefile, which typically is the
+current {@code Android.mk}'s directory. {@code my-dir} is useful for defining
+{@code LOCAL_PATH} at the start of your {@code Android.mk} file. For example:</p>
+
+<pre class="no-pretty-print">
+LOCAL_PATH := $(call my-dir)
+</pre>
+
+<p>Due to the way GNU Make works, what this macro really returns is the
+path of the last makefile that the build system included when parsing the build scripts. For this
+reason, you should not call {@code my-dir} after including another file.</p>
+
+<p>For example, consider the following example: </p>
+
+<pre class="no-pretty-print">
+LOCAL_PATH := $(call my-dir)
+
+# ... declare one module
+
+include $(LOCAL_PATH)/foo/`Android.mk`
+
+LOCAL_PATH := $(call my-dir)
+
+# ... declare another module
+</pre>
+
+<p>The problem here is that the second call to {@code my-dir} defines
+{@code LOCAL_PATH} as {@code $PATH/foo} instead of {@code $PATH}, because that was where its
+most recent include pointed.</p>
+
+<p>You can avoid this problem by putting additional includes after everything
+else in the {@code Android.mk} file. For example:</p>
+
+<pre class="no-pretty-print">
+LOCAL_PATH := $(call my-dir)
+
+# ... declare one module
+
+LOCAL_PATH := $(call my-dir)
+
+# ... declare another module
+
+# extra includes at the end of the Android.mk file
+include $(LOCAL_PATH)/foo/Android.mk
+
+</pre>
+
+<p>If it is not feasible to structure the file in this way, save the value of the first
+{@code my-dir} call into another variable. For example: </p>
+
+<pre class="no-pretty-print">
+MY_LOCAL_PATH := $(call my-dir)
+
+LOCAL_PATH := $(MY_LOCAL_PATH)
+
+# ... declare one module
+
+include $(LOCAL_PATH)/foo/`Android.mk`
+
+LOCAL_PATH := $(MY_LOCAL_PATH)
+
+# ... declare another module
+</pre>
+
+<h4>all-subdir-makefiles</h4>
+
+<p>Returns the list of {@code Android.mk} files located in all subdirectories of
+the current {@code my-dir} path.
+
+<p>You can use this function to provide deep-nested source directory hierarchies to the build
+system. By default, the NDK only looks for files in the directory containing the
+{@code Android.mk} file.</p>
+
+<h4>this-makefile</h4>
+<p>Returns the path of the current makefile (from which the build system called the function).</p>
+
+<h4>parent-makefile</h4>
+<p>Returns the path of the parent makefile in the inclusion tree (the path of the makefile that
+included the current one).</p>
+
+<h4>grand-parent-makefile</h4>
+<p>Returns the path of the grandparent makefile in the inclusion tree (the path of the makefile that
+included the current one).</p>
+
+<h4>import-module</h4>
+<p>A function that allows you to find and include a module's {@code Android.mk} file by the name of
+the module. A typical example is as follows: </p>
+
+<pre class="no-pretty-print">
+$(call import-module,&lt;name&gt;)
+</pre>
+
+<p>In this example, the build system looks for the module tagged {@code &lt;name&gt;} in the list of
+directories referenced that your {@code NDK_MODULE_PATH} environment variable references, and
+includes its {@code Android.mk} file automatically for you.</p> \ No newline at end of file