Android NDK 概述,翻译OVERVIEW.html整体了解NDK
来源:互联网 发布:云端软件平台下载 编辑:程序博客网 时间:2024/05/18 22:43
OVERVIEW.html的翻译(android-ndk-r8版)
Android NDK 概述
简介:
Android NDK是Android应用开发者可以把由c/c++代码编译而来的机器码嵌入到Android应用包的一套工具集。(提示:Android NDK只能用于Android 1.5系统及更新版本。)
一、Android NDK的目标:
(1) Android 虚拟机允许你的应用程序的java代码通过JNI(Java Native Interface,java1.1开始支持的一种技术,它允许Java代码和其他语言写的代码进行交互,尤其是c/c++)java代码里声明,被本地代码实现的方法。简单的说,
①,你的程序通过native关键字来声明一些被本地代码实现的方法。
例如:native byte[] loadFile(String filePath);(这里只是声明)
②,你必须提供一个实现这些被native声明的方法的一个动态库(.so文件),并 且这个动态库会被打包到你的apk中去,这个动态库得符合Unix规范命名, 比如lib<something>.so,并且这个动态库必须有个有个标准的JNI入口点。比 如libFIleLoader.so
③,如果想用动态库,你必须显式的载人这些库,比如,在你的应用开始时载入, 通过下面的代码可以实现(比如你的是libFileLoader.so)。
static{
System.loadLibrary("FileLoader");
}
一定注意要去掉lib前缀名和.so后缀名。
(2) Android NDK是Android SDK的一种补充,帮助你做到:
①,产生能在ARM CPU(很通用的移动架构的cpu)和Android 1.5(以及更新) 环境上运行的JNI编译的动态库(.so文件)。
②,以后的更新的版本,我们打算提供一些调试本地代码的工具(通过gdb远程 连接实现的)提供更多的代码信息。
(3) 更多的,Android NDK提供:
①,一套可以在Linux,OS X和windows平台上生成的 ARM框架的动态库的交叉 工具集(包括编译器,连接器,等等)
②, 一套Android平台提供的本地API集(我们都知道Android的应用层API是 java的,而Android的框架层是c/c++库)对应的系统头文件。这些系统头文 件的定义保证了Android系统更新版本的支持(也就是系统底层的A PI统 一 ,版本什么都好说)。
这些系统头文件(API)在 docs/STABLE-APIS.html 都有详细的说明
记住一点,Android 系统的这些本地的系统库在更新的Android系统中,可能 会被改变甚至删除,)
③ 一套只需要开发者写很小的描述哪些(c/c++)需要编译的配置文件的构建系 统(就是把c/c++代码变成.so文件的系统)。
这套系统自动处理了 编译工具/平台/cpu等等的差异性,更新的Android NDK将支持更多的平台、编译工具以及以及cpu 而且不需要开发更改配置文件。
二、这里Android NDK 不倡议的:
Android NDK方式不是一个在Android平台上写本地代码的好方式。特别是,你的应用程序最好用java代码来操作系统事件和管理应用的生命周期,可以避免应用的无响应的状况。事实上,你是可以通过本地代码(c/c++)来写一个复杂的应用。
在这个环境下,许多操作都要自己具体写,这就需要对JNI的高度掌握。而且这些操作 包括下面:
①,不能够通过本地指针直接访问VM对象的内容。例如你不能安全地得到一个指 向一个循环中被遍历的 String对象的16位char数组 的指针。
②,需要一个本地代码能操作在JNI调用方法之间的VM对象的引用的引用管理器。
Android NDK只提供一套非常有限的c++ ApI以及Android 平台提供的库的 头文件。但是一个典型的android系统包含了许多本地动态库,这些库可能在 Android 系统更新时变化
如果没有明确支持由NDK Android系统库头,这样的话应用程序不应该依赖于它可用,可能在后续的系统更新中这些变得可用。
(选定的系统库,将逐渐被添加到稳定NDK的API中)。
三、Android NDK的实践
这里是如何通过Android的NDK开发本机代码一个非常粗略的概述:
①,把你的c/c++代码放入$PROJECT/jni/目录中( $PROJECT是指你工程目录)。
②,写Android.mk文件到你的$PROJECT/jni/目录下,用来向Android NDK构建 系统来描述你的c/c++文件。
③,(可选项)你可以写一个Application.mk 文件到$PROJECT/jni/下,用来向NDK 构建系统来描述更多工程细节,虽然你不需要它也可以启动程序,但是它可以 更改cpu和一些编译器的配置(docs/APPLICATION-MK.html里有详细说明)。
④,可以通过NDK安装目录下的 ndk-build工具生成动态库(.so).
如果上成功的话, 最后一步复制动态库到你的应用的根目录下,然后你就可以通过通常的方式来生成你的apk文件了。
下面是更详细的一些
(1)配置NDK
早先的版本需要你运行“build/host-setup.sh”脚本来配置你的NDK,Android NDK 版 本4(以及以上版本),都去掉这一步了。
(2)放置c/c++源文件
把你的c/c++代码放入$PROJECT/jni/目录中( $PROJECT是指你工程目录),这个 ‘jni’你是可以自由编辑的,还有jni文件夹里目的名字和结构不会影响你的应用 程序包,所以你可以不用起什么特殊的名字,比如com. <mycompany>.<myproject>。
c/c++文件都是被支持的,NDK中默认的c++后缀名是.cpp,其实其它的后缀名也是支持 的,(详情查看 docs/ANDROID-MK.html)。
(3)写一个Android.mk配置脚本
Android.mk文件是向NDK构建系统描述你的c/c++代码文件的小脚本,它的语法 在docs/ANDROID-MK.html中有详细介绍
简单来说吧,NDK把你的c/c++代码划分模块,每个模块可能构建成一个 静态库 或者一个动态库。
你可以在一个Android.mk文件中构建多个模块,你也可以写多个只包含一个模块 的Android.mk文件,
Android.mk file用来向编译系统描述你的源代码。具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。因此,您应 尽量减少您声明的变量,不要认为某些变量在解析 过程中不会被定义。默认的NDK 会按照
$PROJECT/jni/Android.mk
这个目录来搜索构建脚本.
如果你在子文件夹里建立了Android.mk,那你应该在最顶层的Android.mk中包含 子文件夹中Android.mk,有个函数帮助实现了这一功能
include $(call all-subdir-makefiles)
这样会包含当前目录下所有的Android.mk文件
(4)写一个Application.mk 脚本文件(可选)
Android.mk向NDK构建系统描述你的模块,而Application.mk描述应用本身(详 见docs/APPLICATION.HTML)。它包括:
①,一个应用所需要的一系列模块的详细列表。
②,Cpu架构配置以生成不同的机器码
③,可选配置信息,是发布版还是调试版,用在所有模板构建期间的具体的c/c++ 编译开关。
这个Application.mk是可选的,默认的NDK会从Android.mk中提取出一个 模板列表,还有一个默认的cpu架构配置(armeabi)
有两种方式去用Application.mk,
①,$PROJECT/jni/Application.mk,放置在这个目录下,它会被ndk-build 脚本自动识别
②,$NDK/apps/<name>/Application.mk,这个目录下($NDK你的NDK 安装目录),然后在根目录下执行“make APP=<name>”(其实这 Android NDK 版本4之前用的方法,为了兼容性考虑现在还是支持 的,不过强烈建议用第一种方法,它非常简单)。
这块部分可以详见docs/APPLICATION-MK.html,那里有一个完整的描述。
(5)调用NDK编译系统:
首选的通过NDK编译系统生成 动态库,是用Android NDK 版本4以后的 ‘ndk-build’脚本文件。你也可以用一个旧的方法
那就是通过建立一个“$NDK/apps”这个子文件夹。
在这两种情形下,成功的编译会复制动态库到你的应用程序中
①、使用‘ndk-build‘命令
这个“ndk-build”脚本位于NDK安装的根目录,它可以在任意工程目录中调用,比如:
cd $PROJECT
$NDK/ndk-build
它会自动检测系统和工程决定生成什么。
比如:
ndk-build
ndk-build clean --> clean generated binaries
ndk-build -B V=1 --> force complete rebuild, showing commands
默认的它检测 $PROJECT/jni/Application.mk(可选项), $PROJECT/jni/Android.mk(必须项)。
运行成功的话会生成模板的库文件在你的工程目录下,稍后你就可以通过你的方式生成APK了。
(详见 docs/NDK-BUILD.html,有个详细完整的解释,以及它提供的选项)。
(6)自定义输出文件夹
默认的 ndk-build会放置所有的中间文件到$PROJECT/obj,你也可以通过NDK_OUT选择一个不同的文件夹,
当你定义的时候,这个NDK_OUT会产生两个影响
①它将本应该保存在$PROJECT/obj中的文件都保存在$NDK_OUT中
②它会让 ndk-gdb 去检测 $NDK_OUT而不是$PROJECT/obj来获取生成的库文件版本。
四、生成你的APK
略
五、调试的支持
NDK提供了一个叫 ’ndk-gdb‘的辅助脚本,它可以很容易的连接你应用程序的调试会话。
这只能运行在android2.2或者更高的版本,只要你程序是可调试的,并不需要ROOT权限。
详见docs/NDK-GDB.html,简单的的步骤如下:
(1)确保你程序是可以调试的(AndroidManifest.xml 中debuggle属性为true)
(2)运行ndk-build,然后安装程序到你的设备
(3)登录程序
(4)在你的工程目录下运行 gdb-build(通过参阅GDB用户手册的命令,你会获得一个有用gdb的提示列表)。
纯手打有的翻译加入了自己的意思,翻译不是太好,请谅解。
- Android NDK 概述,翻译OVERVIEW.html整体了解NDK
- Android NDK 概述(Android NDK Overview)
- 【翻译】(1)Android NDK Overview
- Android: Android NDK Overview
- Android NDK Overview
- Android NDK Overview
- Android NDK Overview ---- Android 4.4
- Android NDK文档翻译
- Android NDK概述
- Android NDK概述
- Android NDK概述
- Android NDK概述
- Android NDK编程浅入深出之--了解NDK
- ANDROID NDK文档系列--(一)Android NDK Overview
- 【官网翻译】android NDK
- 了解NDK
- ndk-gdb Overview
- NDK 概述
- 【自然框架】之通用权限:有ER图和表关系图 (收藏)
- dsdgen+dsqgen安装
- 黑马程序员_加速Java应用开发速度3:单元/集成测试+持续集成
- Vim简明教程【CoolShell】
- 判断两个浮点数是否相等
- Android NDK 概述,翻译OVERVIEW.html整体了解NDK
- 在序列中找到符合某个条件的子序列
- uva-11234 Evaluating Simple C Expressions
- 黑马程序员_加速Java应用开发速度4:使用模板技术加速项目开发速度
- win7 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
- uva-839 Not so Mobile
- Android学习日志
- 黑马程序员_加速Java应用开发速度5:使用脚本自动化日常操作
- ubuntu 下友基数位板驱动 和配置