This guide assumes假定 that you are:
This section provides a high-level explanation of how the NDK works. The Android NDK is a set of tools allowing you to embed潜入 C or C++ (“native code”) into your Android apps. The ability to use native code in Android apps can be particularly特别是 useful to developers who wish to do one or more of the following:
This section introduces the main components used in building a native application for Android, and goes on to describe the process of building and packaging.
You should have an understanding of the following components as you build your app:
For more information, see ndk-build.
.dex
(Dalvik EXecutable) files, which are what the Android OS runs in the Dalvik Virtual Machine (“DVM”). Even if your app contains no Java source code at all, the build process still generates a .dex
executable执行档 file within which the native component runs. When developing Java components, use the native
keyword to indicate表明 methods implemented as native code. For example, the following function declaration tells the compiler that the implementation is in a native library:
public native int add(int x, int y);
.so
files, from your native source code. Note: If two libraries implement respective(各自的 分别的 单独的) methods with the same signature签名, a link error occurs. In C, "signature" means method name only. In C++, "signature" means not only method name, but also its argument names and types.
.a
files, which you can link against other libraries..so
files against these definitions定义. Different ABIs correspond to different architectures: The NDK includes ABI support for ARMEABI (default), MIPS, and x86. For more information, see ABI Management.NativeActivity
class in the manifest. Native Activities and Applications provides more detail on how to do this, under “Using thenative_activity.h
interface.”The following two items are only required必需的 for building using the ndk-build
script, and for debugging using thendk-gdb
script.
Android.mk
: You must create an Android.mk
configuration file inside your jni
folder. The ndk-build
script looks at this file, which defines the module组件 and its name, the source files to be compiled, build flags and libraries to link.Application.mk
: This file enumerates列举 and describes the modules that your app requires. This information includes:
The general flow for developing a native app for Android is as follows:
Note: While it is possible to completely avoid避免 Java, you are likely to find the Android Java framework useful for tasks including controlling the display and UI.
NativeActivity
class in AndroidManifest.xml
. You can do so from the Eclipse/ADT Android Manifest Editor, or by hand-editing the file. For more information, see theNative Activities and Applications.Android.mk
file describing the native library, including name, flags, linked libraries, and source files to be compiled in the ‘JNI’ directory.Application.mk
file configuring the target ABIs, toolchain, release/debug mode, and STL(标准模板库(Standard Template Library)). For any of these that you do not specify指定, the following default values are used, respectively:
jni
directory..so
, .a
) libraries..dex
file..so
, .dex
, and other files needed for your app to run.Note that Eclipse can perform steps 7. through 9. in a single operation.
The Android SDK provides a helper class, NativeActivity
, that allows you to write a completely native activity.NativeActivity
handles the communication between the Android framework and your native code, so you do not have to subclass it or call its methods. All you need to do is declare your application to be native in yourAndroidManifest.xml
file, and begin creating your native application.
An Android application using NativeActivity
still runs in its own virtual machine, sandboxed沙盒 from other applications. You can therefore因此 still access Android framework APIs through the JNI. In certain cases在某些特定的情况下, however–such as for sensors, input events, and assets–the NDK provides native interfaces that you can use instead of having to call across the JNI. For more information about such support, see Android NDK Native APIs.
Regardless of whether or not you are developing a native activity, we recommend建议 that you create your projects with the traditional Android build tools. Doing so helps ensure building and packaging of Android applications with the correct structure.
The Android NDK provides you with two choices to implement your native activity:
native_activity.h
header defines the native version of the NativeActivity
class. It contains the callback interface and data structures that you need to create your native activity. Because the main thread of your application handles the callbacks, your callback implementations must not be blocking. If they block, you might receive ANR (Application Not Responding) errors because your main thread is unresponsive until the callback returns.android_native_app_glue.h
file defines a static helper library built on top of the native_activity.h
interface. It spawns生成 another thread, which handles things such as callbacks or input events in an event loop. Moving these events to a separate thread prevents any callbacks from blocking your main thread.The <ndk_root>/sources/android/native_app_glue/android_native_app_glue.c
source is also available, allowing you to modify the implementation.
For more information on how to use this static library, examine检查 the native-activity sample application and its documentation. Further reading is also available in the comments in the<ndk_root>/sources/android/native_app_glue/android_native_app_glue.h
file.
To implement a native activity with the native_activity.h
interface:
jni/
directory in your project's root directory. This directory stores all of your native code.AndroidManifest.xml
file. Because your application has no Java code, set android:hasCode
to false
.
<application android:label="@string/app_name" android:hasCode="false">
You must set the android:name
attribute of the activity tag to NativeActivity
.
<activity android:name="android.app.NativeActivity" android:label="@string/app_name">
Note: You can subclass NativeActivity
. If you do, use the name of the subclass instead ofNativeActivity
.
The android:value
attribute of the meta-data
tag specifies指定 the name of the shared library containing the entry point to the application (such as C/C++ main
), omitting省略 the lib
prefix前缀 and .so
suffix from the library name.
<meta-data android:name="android.app.lib_name" android:value="native-activity" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
ANativeActivity_onCreate
variable变量. The app calls this function when the native activity starts. This function, analogous(相似的 模拟的 ) to main
in C/C++, receives a pointer to an ANativeActivity
structure, which contains function pointers to the various callback implementations that you need to write. Set the applicable callback function pointers inANativeActivity->callbacks
to the implementations of your callbacks.ANativeActivity->instance
field to the address of any instance of specific data that you want to use.ANativeActivity->callbacks
. For more information on when the callbacks are called, see Managing the Activity Lifecycle.Android.mk file
in the jni/
directory of your project to describe your native module to the build system. For more information, see Android.mk.Android.mk
file, compile your native code using the ndk-build
command. $ cd <path>/<to>/<project> $ <ndk>/ndk-build
jni/
directory, the build script automatically packages the .so
file(s) built from it into the APK.