Android NDK 概述,翻译OVERVIEW.html整体了解NDK

来源:互联网 发布:云端软件平台下载 编辑:程序博客网 时间:2024/05/18 22:43

Android NDK博客目录

简单建一个android ndk工程(android环境+android-ndk-r8)
http://blog.csdn.net/nsw911439370/article/details/9246241

Android NDK 概述,翻译OVERVIEW.html整体了解NDK
http://blog.csdn.net/nsw911439370/article/details/9260085

Android.mk语法
http://blog.csdn.net/nsw911439370/article/details/9260473

Application.mk语法
http://blog.csdn.net/nsw911439370/article/details/9260489

Android NDK调用c/c++
http://blog.csdn.net/nsw911439370/article/details/9264993


OVERVIEW.html的翻译(android-ndk-r8版)
Android NDK 概述

简介:
Android NDKAndroid应用开发者可以把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 NDKAndroid SDK的一种补充,帮助你做到:

①,产生能在ARM CPU(很通用的移动架构的cpu)和Android 1.5(以及更新) 环境上运行的JNI编译的动态库(.so文件)。
②,以后的更新的版本,我们打算提供一些调试本地代码的工具(通过gdb远程 连接实现的)提供更多的代码信息。

     (3) 更多的,Android NDK提供:
①,一套可以在Linux,OS Xwindows平台上生成的 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对象的16char数组 的指针。

②,需要一个本地代码能操作在JNI调用方法之间的VM对象的引用的引用管理器。
Android NDK只提供一套非常有限的c++ ApI以及Android 平台提供的库的 头文件。但是一个典型的android系统包含了许多本地动态库,这些库可能在 Android 系统更新时变化
如果没有明确支持由NDK Android系统库头,这样的话应用程序不应该依赖于它可用,可能在后续的系统更新中这些变得可用。

(选定的系统库,将逐渐被添加到稳定NDKAPI)。

三、Android NDK的实践

这里是如何通过AndroidNDK开发本机代码一个非常粗略的概述:

        ①,把你的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”脚本来配置你的NDKAndroid 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.mkNDK构建系统描述你的模块,而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的提示列表)

    纯手打有的翻译加入了自己的意思,翻译不是太好,请谅解。



原创粉丝点击