| ndk=true |
| |
| ndk.win_download=android-ndk-r4b-windows.zip |
| ndk.win_bytes=45792835 |
| ndk.win_checksum=e397145e155a639be53ee4b6db8ad511 |
| |
| ndk.mac_download=android-ndk-r4b-darwin-x86.zip |
| ndk.mac_bytes=50586041 |
| ndk.mac_checksum=41dbd54335fb828ee408eab17103a1b0 |
| |
| ndk.linux_download=android-ndk-r4b-linux-x86.zip |
| ndk.linux_bytes=49464776 |
| ndk.linux_checksum=2deabcb125c219b34140975b710f00ec |
| |
| page.title=Android NDK |
| @jd:body |
| |
| <h2 id="notes">Revisions</h2> |
| |
| <p>The sections below provide information and notes about successive releases of |
| the NDK, as denoted by revision number. </p> |
| |
| <script type="text/javascript"> |
| function toggleDiv(link) { |
| var toggleable = $(link).parent(); |
| if (toggleable.hasClass("closed")) { |
| //$(".toggleme", toggleable).slideDown("fast"); |
| toggleable.removeClass("closed"); |
| toggleable.addClass("open"); |
| $(".toggle-img", toggleable).attr("title", "hide").attr("src", "{@docRoot}assets/images/triangle-opened.png"); |
| } else { |
| //$(".toggleme", toggleable).slideUp("fast"); |
| toggleable.removeClass("open"); |
| toggleable.addClass("closed"); |
| $(".toggle-img", toggleable).attr("title", "show").attr("src", "/assets/images/triangle-closed.png"); |
| } |
| return false; |
| } |
| </script> |
| <style> |
| .toggleable { |
| padding: .25em 1em; |
| } |
| .toggleme { |
| padding: 1em 1em 0 2em; |
| line-height:1em; |
| } |
| .toggleable a { |
| text-decoration:none; |
| } |
| .toggleme a { |
| text-decoration:underline; |
| } |
| .toggleable.closed .toggleme { |
| display:none; |
| } |
| #jd-content .toggle-img { |
| margin:0; |
| } |
| </style> |
| |
| <div class="toggleable open"> |
| <a href="#" |
| onclick="return toggleDiv(this)"><img src="{@docRoot}assets/images/triangle-opened.png" |
| class="toggle-img" |
| height="9px" |
| width="9px" /> Android NDK, Revision 5</a> <em>(November 2010)</em> |
| |
| <div class="toggleme"> |
| <dl> |
| <dt>NDK r5 notes:</dt> |
| |
| <dd> |
| <p>The r5 release of the NDK includes many new APIs, many of which are introduced to |
| support native game development and applications that require similar requirements. Most |
| notably, native activities are now supported, which allow you to write an application |
| entirely with native code. For detailed information describing the changes in this |
| release, read the CHANGES.HTML document included in the downloaded NDK package.</p> |
| </dd> |
| </dl> |
| |
| <dl> |
| <dt>General notes:</dt> |
| |
| <dd> |
| <ul> |
| <li>Adds support for native activities, which allows you to write completely native |
| applications.</li> |
| |
| <li>Adds an EGL library that lets you create and manage OpenGL ES textures and |
| services.</li> |
| |
| <li>Provides an interface that lets you write a native text-to-speech engine.</li> |
| |
| <li>Adds native support for the following: |
| |
| <ul> |
| <li>the input subsystem (such as the keyboard and touch screen)</li> |
| |
| <li>the window and surface subsystem.</li> |
| |
| <li>audio APIs based on the OpenSL ES standard that support playback and recording |
| as well as control over platform audio effects.</li> |
| |
| <li>event loop APIs to wait for things such as input and sensor events.</li> |
| |
| <li>accessing assets packaged in an <code>.apk</code> file.</li> |
| |
| <li>accessing sensor data (accelerometer, compass, gyroscope, etc).</li> |
| |
| <li>provides sample applications, <code>native-plasma</code> and |
| <code>native-activity</code>, to demonstrate how to write a native activity.</li> |
| </ul> |
| </li> |
| </ul> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| |
| <div class="toggleable closed"> |
| <a href="#" |
| onclick="return toggleDiv(this)"><img src="{@docRoot}assets/images/triangle-closed.png" |
| class="toggle-img" |
| height="9px" |
| width="9px" /> Android NDK, Revision 4b</a> <em>(June 2010)</em> |
| |
| <div class="toggleme"> |
| <dl> |
| <dt>NDK r4b notes:</dt> |
| |
| <dd> |
| <p>Includes fixes for several issues in the NDK build and debugging scripts — if |
| you are using NDK r4, we recommend downloading the NDK r4b build. For detailed |
| information describing the changes in this release, read the CHANGES.TXT document |
| included in the downloaded NDK package.</p> |
| </dd> |
| </dl> |
| |
| <dl> |
| <dt>General notes:</dt> |
| |
| <dd> |
| <ul> |
| <li>Provides a simplified build system through the new <code>ndk-build</code> build |
| command.</li> |
| |
| <li>Adds support for easy native debugging of generated machine code on production |
| devices through the new <code>ndk-gdb</code> command.</li> |
| |
| <li>Adds a new Android-specific ABI for ARM-based CPU architectures, |
| <code>armeabi-v7a</code>. The new ABI extends the existing <code>armeabi</code> ABI to |
| include these CPU instruction set extensions: |
| |
| <ul> |
| <li>Thumb-2 instructions</li> |
| |
| <li>VFP hardware FPU instructions (VFPv3-D16)</li> |
| |
| <li>Optional support for ARM Advanced SIMD (NEON) GCC intrinsics and VFPv3-D32. |
| Supported by devices such as Verizon Droid by Motorola, Google Nexus One, and |
| others.</li> |
| </ul> |
| </li> |
| |
| <li>Adds a new <code>cpufeatures</code> static library (with sources) that lets your |
| app detect the host device's CPU features at runtime. Specifically, applications can |
| check for ARMv7-A support, as well as VFPv3-D32 and NEON support, then provide separate |
| code paths as needed.</li> |
| |
| <li>Adds a sample application, <code>hello-neon</code>, that illustrates how to use the |
| <code>cpufeatures</code> library to check CPU features and then provide an optimized |
| code path using NEON instrinsics, if supported by the CPU.</li> |
| |
| <li>Lets you generate machine code for either or both of the instruction sets supported |
| by the NDK. For example, you can build for both ARMv5 and ARMv7-A architectures at the |
| same time and have everything stored to your application's final |
| <code>.apk</code>.</li> |
| |
| <li>To ensure that your applications are available to users only if their devices are |
| capable of running them, Android Market now filters applications based on the |
| instruction set information included in your application — no action is needed on |
| your part to enable the filtering. Additionally, the Android system itself also checks |
| your application at install time and allows the installation to continue only if the |
| application provides a library that is compiled for the device's CPU architecture.</li> |
| |
| <li>Adds support for Android 2.2, including a new stable API for accessing the pixel |
| buffers of {@link android.graphics.Bitmap} objects from native code.</li> |
| </ul> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| |
| <div class="toggleable closed"> |
| <a href="#" |
| onclick="return toggleDiv(this)"><img src="{@docRoot}assets/images/triangle-closed.png" |
| class="toggle-img" |
| height="9px" |
| width="9px" /> Android NDK, Revision 3</a> <em>(March 2010)</em> |
| |
| <div class="toggleme"> |
| <dl> |
| <dt>General notes:</dt> |
| |
| <dd> |
| <ul> |
| <li>Adds OpenGL ES 2.0 native library support.</li> |
| |
| <li>Adds a sample application,<code>hello-gl2</code>, that illustrates the use of |
| OpenGL ES 2.0 vertex and fragment shaders.</li> |
| |
| <li>The toolchain binaries have been refreshed for this release with GCC 4.4.0, which |
| should generate slightly more compact and efficient machine code than the previous one |
| (4.2.1). The NDK also still provides the 4.2.1 binaries, which you can optionally use |
| to build your machine code.</li> |
| </ul> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| |
| <div class="toggleable closed"> |
| <a href="#" |
| onclick="return toggleDiv(this)"><img src="{@docRoot}assets/images/triangle-closed.png" |
| class="toggle-img" |
| height="9px" |
| width="9px" /> Android NDK, Revision 2</a> <em>(September 2009)</em> |
| |
| <div class="toggleme"> |
| <p>Originally released as "Android 1.6 NDK, Release 1".</p> |
| |
| <dl> |
| <dt>General notes:</dt> |
| |
| <dd> |
| <ul> |
| <li>Adds OpenGL ES 1.1 native library support.</li> |
| |
| <li>Adds a sample application, <code>san-angeles</code>, that renders 3D graphics |
| through the native OpenGL ES APIs, while managing activity lifecycle with a {@link |
| android.opengl.GLSurfaceView} object.</li> |
| </ul> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| |
| <div class="toggleable closed"> |
| <a href="#" |
| onclick="return toggleDiv(this)"><img src="{@docRoot}assets/images/triangle-closed.png" |
| class="toggle-img" |
| height="9px" |
| width="9px" /> Android NDK, Revision 1</a> <em>(June 2009)</em> |
| |
| <div class="toggleme"> |
| <p>Originally released as "Android 1.5 NDK, Release 1".</p> |
| |
| <dl> |
| <dt>General notes:</dt> |
| |
| <dd> |
| <ul> |
| <li>Includes compiler support (GCC) for ARMv5TE instructions, including Thumb-1 |
| instructions.</li> |
| |
| <li>Includes system headers for stable native APIs, documentation, and sample |
| applications.</li> |
| </ul> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| |
| <h2 id="installing">Installing the NDK</h2> |
| <p>Installing the NDK on your development computer is straightforward and involves extracting the |
| NDK from its download package. Unlike previous releases, there is no need to run a host-setup |
| script.</p> |
| |
| <p>Before you get started make sure that you have downloaded the latest <a href= |
| "{@docRoot}sdk/index.html">Android SDK</a> and upgraded your applications and environment as |
| needed. The NDK will not work with older versions of the Android SDK. Also, take a moment to |
| review the <a href="{@docRoot}sdk/ndk/reqs.html">System and Software Requirements</a> for the |
| NDK, if you haven't already.</p> |
| |
| <p>To install the NDK, follow these steps:</p> |
| |
| <ol> |
| <li>From the table at the top of this page, select the NDK package that is appropriate for your |
| development computer and download the package.</li> |
| |
| <li>Uncompress the NDK download package using tools available on your computer. When |
| uncompressed, the NDK files are contained in a directory called |
| <code>android-ndk-<version></code>. You can rename the NDK directory if necessary and you |
| can move it to any location on your computer. This documentation refers to the NDK directory as |
| <code><ndk></code>.</li> |
| </ol> |
| |
| <p>You are now ready start working with the NDK.</p> |
| |
| <h2 id="gettingstarted">Getting Started with the NDK</h2> |
| |
| <p>Once you've installed the NDK successfully, take a few minutes to read the documentation |
| included in the NDK. You can find the documentation in the <code><ndk>/docs/</code> |
| directory. In particular, please read the OVERVIEW.HTML document completely, so that you |
| understand the intent of the NDK and how to use it.</p> |
| |
| <p>If you used a previous version of the NDK, take a moment to review the list of NDK changes in |
| the CHANGES.HTML document.</p> |
| |
| <p>Here's the general outline of how you work with the NDK tools:</p> |
| |
| <ol> |
| <li>Place your native sources under <code><project>/jni/...</code></li> |
| |
| <li>Create <code><project>/jni/Android.mk</code> to describe your native sources to the |
| NDK build system</li> |
| |
| <li>Optional: Create <code><project>/jni/Application.mk</code>.</li> |
| |
| <li>Build your native code by running the 'ndk-build' script from your project's directory. It |
| is located in the top-level NDK directory: |
| <pre class="no-pretty-print"> |
| cd <project> |
| <ndk>/ndk-build |
| </pre> |
| |
| <p>The build tools copy the stripped, shared libraries needed by your application to the |
| proper location in the application's project directory.</p> |
| </li> |
| |
| <li>Finally, compile your application using the SDK tools in the usual way. The SDK build tools |
| will package the shared libraries in the application's deployable <code>.apk</code> file.</li> |
| </ol> |
| |
| <p>For complete information on all of the steps listed above, please see the documentation |
| included with the NDK package.</p> |
| |
| <h2 id="samples">Sample Applications</h2> |
| |
| <p>The NDK includes sample applications that illustrate how to use native code in your Android |
| applications:</p> |
| |
| <ul> |
| <li><code>hello-jni</code> — a simple application that loads a string from a native |
| method implemented in a shared library and then displays it in the application UI.</li> |
| |
| <li><code>two-libs</code> — a simple application that loads a shared library dynamically |
| and calls a native method provided by the library. In this case, the method is implemented in a |
| static library imported by the shared library.</li> |
| |
| <li><code>san-angeles</code> — a simple application that renders 3D graphics through the |
| native OpenGL ES APIs, while managing activity lifecycle with a {@link |
| android.opengl.GLSurfaceView} object.</li> |
| |
| <li><code>hello-gl2</code> — a simple application that renders a triangle using OpenGL ES |
| 2.0 vertex and fragment shaders.</li> |
| |
| <li><code>hello-neon</code> — a simple application that shows how to use the |
| <code>cpufeatures</code> library to check CPU capabilities at runtime, then use NEON intrinsics |
| if supported by the CPU. Specifically, the application implements two versions of a tiny |
| benchmark for a FIR filter loop, a C version and a NEON-optimized version for devices that |
| support it.</li> |
| |
| <li><code>bitmap-plasma</code> — a simple application that demonstrates how to access the |
| pixel buffers of Android {@link android.graphics.Bitmap} objects from native code, and uses |
| this to generate an old-school "plasma" effect.</li> |
| |
| <li><code>native-activity</code> — a simple application that demonstrates how to use the |
| native-app-glue static library to create a native activity</li> |
| |
| <li><code>native-plasma</code> — a version of bitmap-plasma implemented with a native |
| activity.</li> |
| </ul> |
| |
| <p>For each sample, the NDK includes the corresponding C source code and the necessary Android.mk |
| and Application.mk files. There are located under <code><ndk>/samples/<name>/</code> |
| and their source code can be found under <code><ndk>/samples/<name>/jni/</code>.</p> |
| |
| <p>You can build the shared libraries for the sample apps by going into |
| <code><ndk>/samples/<name>/</code> then calling the <code>ndk-build</code> command. |
| The generated shared libraries will be located under |
| <code><ndk>/samples/<name>/libs/armeabi/</code> for (ARMv5TE machine code) and/or |
| <code><ndk>/samples/<name>/libs/armeabi-v7a/</code> for (ARMv7 machine code).</p> |
| |
| <p>Next, build the sample Android applications that use the shared libraries:</p> |
| |
| <ul> |
| <li>If you are developing in Eclipse with ADT, use the New Project Wizard to create a new |
| Android project for each sample, using the "Import from Existing Source" option and importing |
| the source from <code><ndk>/apps/<app_name>/project/</code>. Then, set up an AVD, |
| if necessary, and build/run the application in the emulator. For more information about |
| creating a new Android project in Eclipse, see <a href= |
| "{@docRoot}guide/developing/eclipse-adt.html">Developing in Eclipse</a>.</li> |
| |
| <li>If you are developing with Ant, use the <code>android</code> tool to create the build file |
| for each of the sample projects at <code><ndk>/apps/<app_name>/project/</code>. |
| Then set up an AVD, if necessary, build your project in the usual way, and run it in the |
| emulator. For more information, see <a href= |
| "{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>.</li> |
| </ul> |
| |
| <h3 id="hello-jni">Exploring the hello-jni Sample</h3> |
| |
| <p>The hello-jni sample is a simple demonstration on how to use JNI from an Android application. |
| The HelloJni activity receives a string from a simple C function and displays it in a |
| TextView.</p> |
| |
| <p>The main components of the sample include:</p> |
| |
| <ul> |
| <li>The familiar basic structure of an Android application (an <code>AndroidManifest.xml</code> |
| file, a <code>src/</code> and <code>res</code> directories, and a main activity)</li> |
| |
| <li>A <code>jni/</code> directory that includes the implemented source file for the native code |
| as well as the Android.mk file</li> |
| |
| <li>A <code>tests/</code> directory that contains unit test code.</li> |
| </ul> |
| |
| <ol> |
| <li>Create a new project in Eclipse from the existing sample source or use the |
| <code>android</code> tool to update the project so it generates a build.xml file that you can |
| use to build the sample. |
| |
| <ul> |
| <li>In Eclipse: |
| |
| <ol type="a"> |
| <li>Click <strong>File > New Android Project...</strong></li> |
| |
| <li>Select the <strong>Create project from existing source</strong> radio button.</li> |
| |
| <li>Select any API level above Android 1.5.</li> |
| |
| <li>In the <strong>Location</strong> field, click <strong>Browse...</strong> and select |
| the <code><ndk-root>/samples/hello-jni</code> directory.</li> |
| |
| <li>Click <strong>Finish</strong>.</li> |
| </ol> |
| </li> |
| |
| <li>On the command line: |
| |
| <ol type="a"> |
| <li>Change to the <code><ndk-root>/samples/hello-jni</code> directory.</li> |
| |
| <li>Run the following command to generate a build.xml file: |
| <pre class="no-pretty-print"> |
| android update project -p . -s |
| </pre> |
| </li> |
| </ol> |
| </li> |
| </ul> |
| </li> |
| |
| <li>Compile the native code using the <code>ndk-build</code> command. |
| <pre class="no-pretty-print"> |
| cd <ndk-root>/samples/hello-jni |
| <ndk_root>/ndk-build |
| </pre> |
| </li> |
| |
| <li>Build and install the application as you would a normal Android application. If you are |
| using Eclipse, run the application to build and install it on a device. If you are using Ant, |
| run the following commands from the project directory: |
| <pre class="no-pretty-print"> |
| ant debug |
| adb install bin/HelloJni-debug.apk |
| </pre> |
| </li> |
| </ol> |
| |
| <p>When you run the application on the device, the string <code>Hello JNI</code> should appear on |
| your device. You can explore the rest of the samples that are located in the |
| <code><ndk-root>/samples</code> directory for more examples on how to use the JNI.</p> |
| |
| <h3 id="native-activity">Exploring the native-activity Sample Application</h3> |
| |
| <p>The native-activity sample provided with the Android NDK demonstrates how to use the |
| android_native_app_glue static library. This static library makes creating a native activity |
| easier by providing you with an implementation that handles your callbacks in another thread, so |
| you do not have to worry about them blocking your main UI thread. The main parts of the sample |
| are described below:</p> |
| |
| <ul> |
| <li>The familiar basic structure of an Android application (an <code>AndroidManifest.xml</code> |
| file, a <code>src/</code> and <code>res</code> directories). The AndroidManifest.xml declares |
| that the application is native and specifies the .so file of the native activity. See {@link |
| android.app.NativeActivity} for the source or see the |
| <code><ndk_root>/platforms/samples/native-activity/AndroidManifest.xml</code> file.</li> |
| |
| <li>A <code>jni/</code> directory contains the native activity, main.c, which uses the |
| <code>android_native_app_glue.h</code> interface to implement the activity. The Android.mk that |
| describes the native module to the build system also exists here.</li> |
| </ul> |
| |
| <p>To build this sample application:</p> |
| |
| <ol> |
| <li>Create a new project in Eclipse from the existing sample source or use the |
| <code>android</code> tool to update the project so it generates a build.xml file that you can |
| use to build the sample. |
| |
| <ul> |
| <li>In Eclipse: |
| |
| <ol type="a"> |
| <li>Click <strong>File > New Android Project...</strong></li> |
| |
| <li>Select the <strong>Create project from existing source</strong> radio button.</li> |
| |
| <li>Select any API level above Android 2.3.</li> |
| |
| <li>In the <strong>Location</strong> field, click <strong>Browse...</strong> and select |
| the <code><ndk-root>/samples/native-activity</code> directory.</li> |
| |
| <li>Click <strong>Finish</strong>.</li> |
| </ol> |
| </li> |
| |
| <li>On the command line: |
| |
| <ol type="a"> |
| <li>Change to the <code><ndk-root>/samples/native-activity</code> directory.</li> |
| |
| <li>Run the following command to generate a build.xml file: |
| <pre class="no-pretty-print"> |
| android update project -p . -s |
| </pre> |
| </li> |
| </ol> |
| </li> |
| </ul> |
| </li> |
| |
| <li>Compile the native code using the <code>ndk-build</code> command. |
| <pre class="no-pretty-print"> |
| cd <ndk-root>/platforms/samples/android-9/samples/native-activity |
| <ndk_root>/ndk-build |
| </pre> |
| </li> |
| |
| <li>Build and install the application as you would a normal Android application. If you are |
| using Eclipse, run the application to build and install it on a device. If you are using Ant, |
| run the following commands in the project directory, then run the application on the device: |
| <pre class="no-pretty-print"> |
| ant debug |
| adb install bin/NativeActivity-debug.apk |
| </pre> |
| </li> |
| </ol> |
| |
| <h2 id="forum">Discussion Forum and Mailing List</h2> |
| |
| <p>If you have questions about the NDK or would like to read or contribute to discussions about |
| it, please visit the <a href="http://groups.google.com/group/android-ndk">android-ndk</a> group |
| and mailing list.</p> |