本指南假设已经熟悉安卓开发中的本地程序的概念.html
本节提供了NDK如何工做的高级说明。Android NDK是一组高级工具,容许你的Android应用程序中嵌入C或C++(“native code&rdquo)。在Android应用中使用本地代码的功能对于但愿执行如下一项或多项操做的开发人员尤为有用:java
本节介绍在构建Android native应用程序时使用的主要组件, 并继续描述构建和打包过程.android
在构建应用程序时,您应该了解如下组件:api
更多信息, 请查看ndk-build.数据结构
.dex
(Dalvik可执行文件)文件,这个文件在运行Android操做系统的Dalvik虚拟机(“DVM”)中运行的。 即便应用程序根本不包含Java源代码,构建进程仍然会生成一个.dex
可执行文件,这个可执行文件包含了本地组件。当开发Java组件时,使用native关键字来讲明它是一个本地方法。例以下面的方法声明告诉编译器它的实现是在一个库中. 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:oracle
publicnativeint add(int x,int y);
.so
文件. 注意: 若是两个库分别实现了相同的方法声明,在C中会发生衔接错误, "签名"意味着方法名惟一。在C++中, "签名"意味着不只方法名称,还意味着其参数名称和类型.app
.a
文件,你能够将其连接到其余库..so
文件。 不一样的ABI对应于不一样的体系结构:NDK包括对ARMEABI(默认),MIPS和x86的ABI支持。 有关更多信息,请参阅ABI管理.NativeActivity
类。在“native_activity.h
”下, class in the . Native Activities和应用程序提供了有关如何执行此操做的更多详细信息。如下两个项目只须要使用ndk-build
脚本进行构建,以及使用 ndk-gdb
脚本进行调试。框架
Android.mk
: 你必须在 jni
目录中建立一个 Android.mk
配置文件。ndk-build
脚本将会查看这个文件,他定义了模块及名称,要编译的源文件,衔接标志和库。.Application.mk
: 此文件列举和描述应用程序须要的模块。此信息包括:
开发Android Native应用程序的通常流程以下:ide
注意: 虽然能够彻底避免Java,你会发现Android Java框架对于包括控制显示和UI在内的任务很是有用.函数
Android.mk
文件,这个文件包含了在"JNI"目录下用于编译的名称,标识,衔接库和源文件.Application.mk
文件配置相应的ABI,工具链,发布/调试模式和STL。若是你没有任何配置,分别使用如下默认值:
jni
目录下..so
, .a
)..dex
文件..so
, .dex
以及运行应用程序所需的其余文件.Android SDK提供了一个帮助类NativeActivity
, 它容许你写一个彻底的NativeActivity
。NativeActivity
处理Android框架和你的本地代码之间的通讯,因此你没必要让它成为派生类或调用它的方法。你只须要在AndroidManifest.xml
文件中声明你的应用程序是native应用程序。.
使用NativeActivity
的Android应用程序仍然在其本身的虚拟机中运行,其它应用程序在沙盒中运行。你仍然能够经过JNI访问Android框架API,在某些状况下,例如对于传感器,输入事件,资源文件,NDK提供本地接口调用,而没必要经过JNI调用。有关此类支持的详细信息,请参阅Android NDK Native APIs..
不管您是否正在开发native Activity, 咱们建议你使用传统的Android构建工具建立项目。这样作能确保构建和打包的应用程序是正确构造的.
Android NDK为您提供两种选择来实现native activity:
native_activity.h
头文件定义了NativeActivity
类的native版本,它包含建立Native Activity所需的回调接口和数据结构。由于你应用程序的主线程处理回调,你的回调实现不能阻塞,若是回调实现阻塞,你可能会收到ANR(应用程序不响应)错误,由于您的主线程没有响应,直到回调返回。.native_activity.h
接口基础上, android_native_app_glue.h
文件定义了一个静态辅助库。它产生另外一个线程处理事件循环中的回调或输入事件。将这些事件移动到单独的线程防止任何回调阻塞你的主线程。.<ndk_root>/sources/android/native_app_glue/android_native_app_glue.c
源文件是可用的, 容许你修改实现.
有关如何使用此静态库的更多信息,请查看native-activity示例应用程序和文档。 进一步阅读能够查看在<ndk_root>/sources/android/native_app_glue/android_native_app_glue.h
文件中的注释.
使用native_activity.h
接口实现一个native activity
1.在你项目的根目录下建立一个jni
目录。此目录存储全部本地代码.
2.在在AndroidManifest.xml文件中声明native activity文件中声明native activity.
由于你的应用程序没有Java代码,请将android:hasCode
设置false
.
<applicationandroid:label="@string/app_name"android:hasCode="false">
你必须设置activity标记(android:name
属性)为NativeActivity
.
<activityandroid:name="android.app.NativeActivity" android:label="@string/app_name">
注意: 你能够建立一个NativeActivity
的派生类,这是要把ndroid:name属性值设为派生类的类名.
meta-data
标签的android:value
属性指定为动态库的名称, 他包含了应用程序的入口点(例如C/C++的main
函数),库名省略lib
前缀和.so
后缀.
<meta-dataandroid:name="android.app.lib_name" android:value="native-activity"/> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
3.为native activity建立一个文件,并实如今 ANativeActivity_onCreate
变量中命名的函数。当native activity开始运行时应用程序将调用这个函数。这个函数相似于C/C++中的main
函数,它接收一个指向ANativeActivity
结构的指针,该结构体包含了各类须要你编写实现的函数指针。在ANativeActivity->callbacks
中的回调函数指针设置为回调的实现.
4.将ANativeActivity->instance
字段设置为你想使用的任何特定数据实例的地址.
5.在Activity启动前能够实现你想作的其它一些工做.
6.在ANativeActivity->callbacks
.中设置实现的其他回调,有关调用回调的更多信息,请查看 Activity生命周期..
7.开发应用程序的其他部分.
8.在项目的jni/
目录中建立一个Android.mk file
文件,描述本地模块信息以便构建系统编译。有关详细信息,请参阅Android.mk.
9.若是你有一个Android.mk
文件, 使用ndk-build
命令编译本地代码.
$ cd <path>/<to>/<project> $ <ndk>/ndk-build
10.像以往同样构建和安装你的Android项目。若是您的本地代码在jni/
目录中,构建脚本会自动将构建的.so
文件打包到APK中.