anroid ndk文档翻译之一:android ndk一览
原译者email: acleverdetective@163.com 。
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包中。
- 在 NDK 的以后修订版中,我们打算提供帮助你通过 gdb 连接来调试原生代码的工具,并且提供尽可能多的符号信息。
此外, Android NDK 还提供:
- 一套交叉工具链(编译器,链接器,等等),能够在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中。