MyException - 我的异常网
当前位置:我的异常网» Android » NDK 开发指南-Android NDK概览

NDK 开发指南-Android NDK概览

www.MyException.Cn  网友分享于:2013-08-17  浏览:26次
NDK 开发指南---Android NDK概览

 

Android NDK 概览

介绍:

    Android SDK是一个允许Android应用开发人员使用CC++源文件编译并嵌入到本机源代码中的应用程序包的一组工    具。

重要说明:

   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还提供:

 

----一组交叉编译链(编译器、链接器等)来生成可以在LinuxOS XWindows(Cygwin)运行的二进制文件

 

----一组与由Android平台提供的稳定的本地API列表的头文件

    它们在docs/STABLE-APIS.html中有说明

 

重要提示:

记住,在以后的更新和发布平台中,Android系统镜像中的大多数本地系统库并不是一成不变的,而是可以彻底改变,       甚至删除的

 

----一个编译系统(build system)可以允许开发者写一个非常短的编译文件(build files)去描述哪个源代码需要编               译,并且怎样编译。编译系统可以解决所有的toolchain/platform/CPU/ABI细节的问题。并且,较晚的NDK版               本中还添加了更多的可以不用改变开发者的编译文件的情况下的toolchainsplatforms,系统接口

 

2.Android NDK的缺点

NDK并不是一个可以编写通用的源代码并且可以在Android设备上运行的方法,你的应用程序还是需要使用JAVA程序,适当的处理系统事件来避免“应用程序没有反应”的对话框或者处理Android应用程序的生命周期

 

注意:可以适当的在源代码中写一个复杂的应用程序,用于启动/停止一个小型的“应用程序包”

 

强烈建议很好地理解的 JNI,因为许多操作在这种环境要求的开发人员,都采取具体的行动,不一定在常见典型的本机代码。这些措施包括:

 

----不能通过指针直接访问VM的对象。比如:你不能安全的得到一个指向String对象的16char数组的循环遍历

 

----需要显示引用管理本机代码时候要保持处理JNI调用之间的VM对象

 

NDKAndroid平台仅仅提供了有限的本地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是支持CC++的,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

 

结果如下:


 

这将启动NDKbuild脚本,它会自动探测您开发的系统和应用程序项目文件,以确定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用户手册命令。

1 楼 fengge0304 2012-01-09  
2 楼 zhuyz89 2012-06-19  
写的挺详细的,不错

文章评论

“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
 程序员的样子
程序员的样子
代码女神横空出世
代码女神横空出世
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
鲜为人知的编程真相
鲜为人知的编程真相
程序员和编码员之间的区别
程序员和编码员之间的区别
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
漫画:程序员的工作
漫画:程序员的工作
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我是如何打败拖延症的
我是如何打败拖延症的
程序员的鄙视链
程序员的鄙视链
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
那些争议最大的编程观点
那些争议最大的编程观点
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java程序员必看电影
Java程序员必看电影
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员都该阅读的书
程序员都该阅读的书
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
中美印日四国程序员比较
中美印日四国程序员比较
每天工作4小时的程序员
每天工作4小时的程序员
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员应该关注的一些事儿
程序员应该关注的一些事儿
我的丈夫是个程序员
我的丈夫是个程序员
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
为什么程序员都是夜猫子
为什么程序员都是夜猫子
一个程序员的时间管理
一个程序员的时间管理
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员必看的十大电影
程序员必看的十大电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有