标签:响应 如何 ndk word 特定 代码 包括 根目录 静态
本指南假设已经熟悉安卓开发中的本地程序的概念.
本节提供了NDK如何工作的高级说明。Android NDK是一组高级工具,允许你的Android应用程序中嵌入C或C++(“native code&rdquo)。在Android应用中使用本地代码的功能对于希望执行以下一项或多项操作的开发人员尤其有用:
本节介绍在构建Android native应用程序时使用的主要组件, 并继续描述构建和打包过程.
在构建应用程序时,您应该了解以下组件:
更多信息, 请查看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:
publicnativeint add(int x,int y);
.so
文件.
注意: 如果两个库分别实现了相同的方法声明,在C中会发生衔接错误, "签名"意味着方法名唯一。在C++中, "签名"意味着不仅方法名称,还意味着其参数名称和类型.
.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应用程序的一般流程如下:
注意: 虽然可以完全避免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中.
标签:响应 如何 ndk word 特定 代码 包括 根目录 静态
原文地址:http://www.cnblogs.com/notepad/p/6034261.html