转自:http://hualang.iteye.com/blog/1135105
Android NDK 概览
介绍:
Android SDK是一个允许Android应用开发人员使用C或C++源文件编译并嵌入到本机源代码中的应用程序包的一组工 具。
重要说明:
Android NDK只能用于android 1.5以上版本
1. Android NDK的目的:
Android虚拟机允许你的应用程序源代码通过JNI调用在本地实现的源代码,简单的说,这就意味着:
----你的应用程序将声明一个或多个用’native’关键字的方法用来指明它们是通过本地代码实现的
例如:native byte[] loadFile(String filePath)
----你必须提供包含实现这些方法的共享库(就是.so),将共享库打包到你的应用程序包apk中,这些库文件必须根据 标准的Unix约定来命名为 lib<something>.so,并且是需要包含一个标准的JNI的接口,例如
libFileLoader.so
----你的应用程序必须明确的装载这些库文件(.so文件),比如,在程序的开始装载它,只需要简单的添加几句源代码:
static {
System.loadLibrary(“FileLoader”);
}
注意:这里你不必再将前缀lib和后缀.so写入。
Android NDK对于Android SDK只是个组件,它可以帮你:
----生成的JNI兼容的共享库可以在大于Android1.5平台的ARM CPU上运行
----将生成的共享库拷贝到合适的程序工程路径的位置上,以保证它们自动的添加到你的apk包中(并且签名的)
----在以后的版本中,我们将提供来帮助你的源代码通过远程gdb连接和尽可能多的源代码的信息。
而且,Android NDK还提供:
----一组交叉编译链(编译器、链接器等)来生成可以在Linux,OS X和Windows(用Cygwin)运行的二进制文件
----一组与由Android平台提供的稳定的本地API列表的头文件
它们在docs/STABLE-APIS.html中有说明
重要提示:
记住,在以后的更新和发布平台中,Android系统镜像中的大多数本地系统库并不是一成不变的,而是可以彻底改变, 甚至删除的
----一个编译系统(build system)可以允许开发者写一个非常短的编译文件(build files)去描述哪个源代码需要编 译,并且怎样编译。编译系统可以解决所有的toolchain/platform/CPU/ABI细节的问题。并且,较晚的NDK版 本中还添加了更多的可以不用改变开发者的编译文件的情况下的toolchains,platforms,系统接口
2.Android NDK的缺点
NDK并不是一个可以编写通用的源代码并且可以在Android设备上运行的方法,你的应用程序还是需要使用JAVA程序,适当的处理系统事件来避免“应用程序没有反应”的对话框或者处理Android应用程序的生命周期
注意:可以适当的在源代码中写一个复杂的应用程序,用于启动/停止一个小型的“应用程序包”
强烈建议很好地理解的 JNI,因为许多操作在这种环境要求的开发人员,都采取具体的行动,不一定在常见典型的本机代码。这些措施包括:
----不能通过指针直接访问VM的对象。比如:你不能安全的得到一个指向String对象的16位char数组的循环遍历
----需要显示引用管理本机代码时候要保持处理JNI调用之间的VM对象
NDK在Android平台仅仅提供了有限的本地API和库文件的支持的系统头文件,然而一个标准的Android系统镜像包括许多本地共享库,这些都应该被考虑在更新和发行版本的可以彻底改变的实现细节
如果Android系统库没有明确的被NDK明确的支持,然后应用程序不应该依赖于它提供的,或者打破了将来在各种设备上的无线系统更新
选定的系统库将逐渐被添加到稳定的NDK API中
3.NDK开发实践
下面将给出一个怎样用Android NDK开发本地代码的粗略的概述
(1) 把本地代码放在$PROJECT/jni/…下,比如将hello.c放到apps/hello/jni/目录下
(2) 在你的NDK编译系统中在$PROJECT/jni/Android.mk来描述你的源代码
(3) 可选:在$PROJECT/jni/Application.mk到你的编译系统中来详细描述你的项目,尽管你开始的话不一定需要它, 但是它允许你使用更多的CPU或者覆盖编译器/链接器 的标记(看docs/APPLICATION-MK.html了解更多细节)
(4) 从你的项目的目录开始通过运行”$NDK/ndk-build”来编译你的代码,或者从子目录开始
(5) 最后一步可以copy,万一成功,剥离共享库的应用层序需要你的应用程序的项目根目录。然后你通过通常的方法来 生成最终的apk
现在,开始一些更 的细节
① 配置N DK
以前的发行版本需要你运行“build/host-setup.sh”脚本来配置你的NDK。从release 4(NDK r)以后就完全去除了这一步
② 放置C/C++代码
假如我们创建的是test目录,创建的代码hello.c
把hello.c放到test/jni目录下
这个项目的位置相当于你的Android应用程序项目的路径
这样你就很轻松的组织起来了你想要的jni的目录,这里项目目录的名字和结构不会影响到最终生成的apk,所以 你不必用类似于com.<mycompany>.<myproject>作为应用程序包名
注意,NDK是支持C和C++的,NDK支持的C++文件扩展名是’.cpp’,但是其他的扩展名也是可以被处理的 (看docs/ANDROID-MK.html了解更多)
它可以通过调整你的Android.mk文件来将源代码放在不同的位置
③ 创建一个Android.mk编译脚本
Android.mk文件是一个小型的编译脚本,你可以在NDK编译系统中用它来描述你的源代码。更详细的描述在docs/ANDROID-MK.html中
总而言之,NDK将你的源代码聚合到模块(modules)中,每个模块可以执行下列之一
----一个静态库(lib<project>.a)
----一个动态库(lib<project>.so)
你可以在Android.mk中定义多个模块,或者你可以编写多个Android.mk文件,每一个定义一个单独的模块
注意,单独的Android.mk也行被编译系统多次解析,以确定哪些变量没有被定义。
默认地,NDK会通过如下的编译脚本去寻找
test/jni/Android.mk(存放位置)
如果你想定义Android.mk到子目录中,你需要在最高层的Android.mk中明确的包含它们,下面是一个帮助的方法可以实现这个功能。
include $(call all-subdir-makefiles)
它会将所有的在子目录中的Android.mk文件加入到当前编译文件的路径中
④ 写一个Application.mk编译文件(可选)
在你的编译系统中有一个Android.mk文件描述模块的同时,Application.mk文件藐视你的应用程序本身。请看docs/APPLICATION-MK.html文档来理解这个文件允许我们做什么。这包括
----你的应用程序需要模块的准确清单
----CPU架构生成机器代码
----可选信息,你是否需要一个release或者debug build,特殊的C/C++编译器标志和其他适用于所有模块的build
这个文件是可选文件:默认地,NDK会提供一个对于所有的在你的Android.mk(所有的makefiles都在里面)中的所有模块的简单编译并且指定默认的CPU ABI
使用Application.mk有两种方法:
----把它放到 test/jni/Application.mk,它就会自动的被’ndk-build’脚本找出来
----把它放在NDK/<name>/Application.mk,也就是NDK安装的路径下,然后从NDK目录下执行”make APP=<name>”
这个方法是Android NDK r4以前的。现在仍然兼容。但是我们强烈建议你使用第一种方法,因为它更简单并且不用修改NDK安装树的目录。
再次看看docs/APPLICATION-MK.html对于它的完整说明
⑤ 调用NDK编译系统
用NDK编译成机器码的最好方法是使用”ndk-build”脚本,你还可以使用第二个,这取决于你早起常见的”$NDK/apps”子目录
在两种情况下,成功构建将copy应用程序所需的最终的已经剥离的二进制模块(即共享库)到应用程序的项目路径中(注意,未剥离的版本主要是用于调试目的,无需拷贝未剥离的二进制文件到设备中)
[1]:使用’ndk-build’命令
‘ndk-build’脚本位于NDK安装目录最顶层,可以直接被应用程序项目目录(你的AndroidManifest.xml文件所在位置)或者其他任何子目录
$ cd $PROJECT
$ $NDK/ndk-build(注意是$NDK/ndkbuild,这是个命令)
前提:你先在cyg/etc/skel目录下找到.bash_profile,拷贝到Administrator目录下,然后在里面加入
NDK=/cygdrive/e/lOVEAndroid/Android/android-ndk-r6
export NDK
重启,即可使用了。
例如:
$ cd samples/two-libs
$ $NDK/ndk-build
结果如下:
这将启动NDK的build脚本,它会自动探测您开发的系统和应用程序项目文件,以确定build设么
例如:
$ndk-build
$ndk-build clean à清理生成的二进制文件
$ndk-build –B V=1 à强制完全重新build,显示命令
默认的,它期望的是可选文件 $PROJECT/jni/Application.mk和必须的文件$PROJECT/jni/Android.mk
成功的话,它讲话就复制生成的二进制模块(即共享库.so文件)到你的项目树中的适当位置。您可以在以后重新build完整的Android应用程序包或者通过“ant”命令,或者ADT插件。
可以看docs/NDK-BUILD.html来了解更多的信息
[2]:使用$NDK/apps/<name>/Application.mk
这种build方法是在Android NDK r4版本之前的,不过依然兼容现在的。我们强烈建议您尽可能的使用’ndk-build’,因为我们可能会删除在以后的NDK发行版本中的支持
① 创建一个子目录为$NDK/apps/<name>/
② 在$NDK/apps/<name>/目录下写一个Application.mk文件,然后需要定义一个APP_PROJECT_PATH来 执行你的应用程序项目的目录。
③ 进入到NDK安装目录,然后再输入如下的命令
$cd $NDK
注意:输入cd $NDK后,会自动跳到你设置的ndk的目录中
$make APP=<name>
或
$make APP=<name> -B 表示重新编译
结果跟第一种方法一样,除了中间文件被放置到了$NDK/out/apps/<name>/
4.从新build你的应用程序包
在NDK生成的二进制文件后,你需要使用一般的方法来重新build你的Android应用程序包文件(apk),或者用“ant”命令或者ADT插件
有关详细信息,请参阅Android SDK的文档,新的.apk会嵌入到您的共享库中,他们将自动提取安装时由系统安装的软件包到你的Android设备上
5. 调试支持
NDK提供了一个服务脚本,名字叫”ndk-gdb”,很容易推出一个应用程序的本地调试会话。
本机调试仅仅能运行在Android 2.2或者更高版本,并且不需要root权限或者特权访问,所以可以随意调试你的应用程序。
有关详细信息,请阅读DOCS / NDK- GDB.html。总括而言,本机调试
遵循这个简单的计划:
(1)确保您的应用程序调试(如设置机器人:调试“真”,在您的AndroidManifest.xml)
(2) “NDK构建”构建您的应用程序,然后安装在您的 设备/模拟器
(3)启动应用程序。
(4)运行“ndk-gdb”从你的应用程序项目目录。
你会得到一个gdb提示符。一个有用的列表,请参阅GDB用户手册命令。
- 大小: 6.3 KB
- 大小: 3.3 KB
分享到:
相关推荐
【Android NDK 开发指南】 Android NDK 是一套专门针对Android应用开发的工具集,它允许开发者使用C或C++语言编写源代码,并将其编译为原生代码,嵌入到Android应用程序中。NDK 提供了一种方式,使得开发者能够利用...
- **初学者**:对于刚刚接触Android NDK的开发者来说,本书提供了详细的入门指南,帮助他们快速上手。 - **进阶用户**:对于已经有一定基础的开发者,本书深入探讨了NDK编程的细节和技巧,有助于进一步提高开发水平...
《Android NDK Beginner's Guide》不仅是一本关于Android原生开发的技术指南,也是一本实践手册。通过阅读本书,读者将能够掌握利用C/C++编写高性能Android应用的关键技能,并学会如何有效地整合现有技术和库资源。...
#### 一、Android NDK 概览 **Android NDK**(Native Development Kit)是一套工具集,允许开发者为Android平台创建原生应用程序或库。通过使用C/C++语言编写代码,可以提高应用程序的性能,尤其是在图形处理和计算...
### Android开发指南中文版知识点概览 #### 一、Android平台概述 - **定义与特点**:Android是一种基于Linux内核的开源操作系统,主要用于移动设备,如智能手机和平板电脑等。它具有高度可定制性、丰富的API接口...
《Android Recipes - A Problem-Solution Approach》第二版是一本详尽的Android应用开发指南,它通过问题解决的方法来帮助开发者掌握Android应用的开发技巧。本书不仅包含了理论知识,还提供了大量的实际示例代码,...
- **SDK与NDK**:SDK是软件开发工具包,包含了编译Android程序所需的API接口;NDK是原生开发工具包,允许开发者使用C/C++编写代码。 **3. 基础UI组件** - **常用UI控件**:TextView、Button、EditText等。 - **...
- Android开发流程概览。 - 开发工具和环境设置指南。 - 如何搭建和配置Android开发环境。 - Android应用程序的基本结构和组件。 #### 中级概念 这一章节深入探讨了Android平台上的驱动程序开发和HAL开发,具体...
综上所述,《Android开发应用揭秘》是一本内容全面、实战性强的Android开发指南,无论是对于初学者还是经验丰富的开发者来说,都具有很高的参考价值。通过本书的学习,读者不仅可以掌握Android开发的基础知识,还能...
《Android OPhone 开发完全讲义》不仅涵盖了Android和OPhone开发的基础知识,还深入介绍了各种高级技术,是一本非常全面且实用的开发指南。无论是对于初学者还是经验丰富的开发者而言,本书都具有很高的参考价值。
#### 一、Android开发基础概览 - **Android框架介绍**:包括Android的架构层次结构、各层功能介绍及其相互间的关系。 - **Android组件详解**:深入剖析Activity、Service、BroadcastReceiver、ContentProvider等基本...
### 精通Android 4 游戏开发关键知识点概览 #### 一、书籍概述与目标读者 《精通Android 4 游戏开发》是一本面向已经掌握一定Android应用开发基础的开发者们的高级指南。本书通过实际案例,教授如何利用Android ...
### 专业Android应用开发知识点概览 #### 一、书籍基本信息 - **书名**:《Professional Android Application Development》(专业Android应用开发) - **作者**:Reto Meier - **出版商**:Wiley Publishing, Inc....
### Android Recipes: A Problem-Solution Approach — 知识点概览 #### 一、书籍概述与定位 《Android Recipes: A Problem-Solution Approach》是一本旨在通过实际代码示例指导读者逐步掌握Android开发技巧的书籍...