Android NDK一览
介绍:
Android NDK是一套工具,允许程序开发人员把C和C++编译出来的机器代码嵌入到他们的应用程序包。
重要信息:
Android NDK 只能够用在Android 1.5 或以后的平台上。
1.0 and 1.1系统不被支持,原因在于1.5的发行版在ABI和工具链上已经发生了一些细小的变化。
I.
Android NDK 目标:
--------------------------
Android VM 允许你的应用程序通过JNI调用在本地代码中实现的方法,简而言之,这意味着:
-你的程序代码将使用native关键字来声明方法,以指明他们是在本地代码中实现的。例如:
native byte[]
loadFile(String
filePath);
-你必须提供一个本地共享库,来实现这些方法,这个共享库将被打包进你程序中的.apk文件,这个库必须使用标准的unix命名约定,象lib<something>.so这样,并且应该包含一个标准的jni入口(以后会有多个),例如:
libFileLoader.so
-你的程序必须显式地加载库,例如,要在启动时加载它,简单地添加下列代码:
static {
System.loadLibrary("FileLoader");
}
注意,你不应该使用’lib’前缀,和’.so’后缀。
Android NDK是Android SDK的补充,可以帮助你:
-生成与JNI兼容的共享库,能够运行在Android 1.5 及以后使用ARM CPU的平台上。
-复制共享库文件到你的应用程序项目的适当路径当中,这样他们就能被自动添加到你最终的.apks包中。
-一套交叉工具链(编译器,链接器,等等),能够在linux,OS X,和windows等系统下,生成原生ARM的机器代码。
-一套Android平台提供的稳定的原生API的系统头文件,这些头文件定义保证在以后的发行版本中获得支持。
重要信息:
记住:Android系统的多数原生系统库都不是静止不变的,在以后平台的发行版或升级版中,可能会发生剧烈的变化,甚至会被删除,
-一套编译系统,允许开发人员写很短的生成文件描述需要编译的源代码,编译系统处理所有的关于toolchain/platform/CPU/ABI等麻烦的细节问题。此外,NDK的以后升级版中,可能会添加许多关于
工具链,平台和系统接口的支持,这些支持并不需要开发人员改变生成文件(或以后生成的其他什么文件)
II. Android NDK 不能达成的目标:
--------------------------
NDK并不是写在Android设备中运行的原生代码的一个好的方式,特别强调,你的应用程序仍然应该使用java语言写,适时地处理Android系统事件,避免出现程序没响应对话框,或者处理Android程序的生命周期。
注意,无论如何,用原生代码写一个复杂的程序,用一个小的”程序包装器”来恰当地启动/终止它,这是可能办到的。
因为许多环境中的操作要求有开发人员具体的指令,在写原生代码时,并不能做到通用,所以我们强烈推荐一种JNI的好的运用方式,这包括:
- 不能直接访问通过直接的原生指针去访问VM对象中的内容,例如,你不能安全地获取一个指向字符串对象的16位字符数组的指针,然后在循环中迭代。
- 在想要在原生代码当中保留VM对象的句柄时,要求显式的引用管理,
NDK只提供很有限的被Android平台支持的头文件和库,但是Android系统包含很多原生共享库,这些不被支持的库,应该被认为是可能在以后平台的发行版和升级版中,在实现细节上会发生激烈变化的部分。
如果一个Android系统裤没有被NDK头文件显式地支持,那么程序就不应当依赖它,否则就会有在以后升级版中受破坏的风险。已经选择的系统库将会被逐渐加入到稳定的NDK API中。