资源预览内容
第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
第9页 / 共37页
第10页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第10章AndroidNDK开发 本章学习目标 了解AndroidNDK的用途掌握AndroidNDK编译环境的安装与配置方法掌握AndroidNDK的开发方法 10 1NDK简介 AndroidNDK AndroidNativeDevelopmentKit 是一系列的开发工具 允许程序开发人员在Android应用程序中嵌入C C 语言编写的非托管代码AndroidNDK优势解决了核心模块使用托管语言开发执行效率低下的问题允许程序开发人员直接使用C C 源代码 极大的提高了Android应用程序开发的灵活性AndroidNDK不足增加程序的例如信号处理或物理仿真 使用非托管代码运行效率最高 复杂性 增加了程序调试的难度CPU运算量大和内存消耗较少的部分 因此并不是所有的核心部分都适合使用C C 语言编写 10 1NDK简介 AndroidNDKAndroidNDK的版本是1 5 集成了交叉编译器 支持ARMv5TE处理器指令集 JNI接口和一些稳定的库文件AndroidNDK仅支持AndroidSDK1 5版本 因此1 0和1 1版本的应用程序不能够使用AndroidNDKAndroidNDK提供一系列的说明文档 示例代码和开发工具 指导程序开发人员使用C C 语言进行库文件开发 并提供便捷工具将库文件打包到apk文件中 10 2NDK编译环境 AndroidNDK编译环境支持WindowsXP Linux和MacOS 本书仅介绍Windows系统的编译环境配置方法Windows系统的编译环境配置方法下载AndroidNDK的安装包下载并安装Cygwin配置Cygwin的NDK开发环境测试开发环境是否可以正常工作 10 2NDK编译环境 下载AndroidNDK的安装包在Google的官方网站下载AndroidNDK的安装包 下载地址是 10 2NDK编译环境 下载AndroidNDK的安装包将下载的ZIP文件解压缩到用户的Android开发目录中 作者将AndroidNDK解压到E Android目录中 ZIP文件中包含一层目录 因此AndroidNDK的最终路径为E Android android ndk 1 5 r1 10 2NDK编译环境 下载并安装CygwinAndroidNDK目前还不支持在Windows系统下直接进行交叉编译 因此需要在Windows系统下安装一个Linux的模拟器环境Cygwin 完成C C 代码的交叉编译工作AndroidNDK要求GNUMake的版本高于或等于3 18 之前的版本并没有经过测试 因此需要安装较新版本的CygwinCygwin的最新版本可以到官方网站下载 也可以到中文的映像网站下载 10 2NDK编译环境 下载并安装Cygwin在Cygwin的安装过程中 需要将Devel下的gcc和make的相关选项选上 否则Cygwin将无法编译C C 代码文件 10 2NDK编译环境 配置Cygwin的NDK开发环境在缺省情况下 Cygwin安装在C盘的根目录下 修改C cygwin home username bash profile文件 username会根据用户使用的用户名称而变化在 bash profile文件的结尾处添加如下代码上面的代码说明了AndroidNDK所在的目录 目录是e盘android android ndk 1 5 r1如果AndroidNDK安装在c盘的TestAndroid android ndk 1 5 r1中 则上面的代码则应该为 10 2NDK编译环境 测试开发环境是否可以正常工作首先启动Cygwin 然后切换到 build目录中 运行host setup sh文件如果运行结果如下图 说明AndroidNDK的开发环境已经可以正常工作了AndroidNDK的编译环境已经安装配置完毕 10 2NDK编译环境 AndroidNDK的目录结构在android ndk 1 5 r1目录中 包含5个子目录和2个文件apps目录是Android工程的保存目录 子目录hello jni和tow libs是NDK自带的两个示例目录build目录保存了交叉编译工具 编译脚本和配置文件docs目录是帮助文档的保存目录out目录是交叉编译的输出目录 保存输出的so文件 10 2NDK编译环境 AndroidNDK的目录结构sources目录是C C 源代码文件的保存目录 其下的hello jni和tow libs子目录 分别保存了NDK自带示例所需要的C C 源代码文件GNUmakfile文件和README TXT文件分别是make工具的配置文件和NDK的说明文件 10 2NDK编译环境 AndroidNDK的目录结构docs目录中的帮助文件说明 10 2NDK编译环境 AndroidNDK自带两个示例hello jni和tow libshello jni是一个非常简单的例子 非托管代码实现了一个可以返回字符串的共享库 Android工程调用这个共享库获取字符串 然后显示在用户界面上tow libs是稍微复杂一些的例子 使用非托管代码实现了一个数学运算的共享库 Android工程动态加载这个共享库 并调用其中的函数 函数功能是通过使用静态库实现的 10 3NDK开发示例 在进行NDK开发时 一般需要同时建立Android工程和C C 工程 然后使用NDK编译C C 工程 形成可以被调用的共享库 最后共享库文件会被拷贝到Android工程中 并被直接打包到apk文件中后面的内容将AndroidNdkDemo示例说明如何进行AndroidNDK开发AndroidNdkDemo是一个进行加法运算的示例 程序会随机产生两个整数 然后调用C语言开发的共享库对这两个整数进行加法运算 最后将运算结果显示在用户界面上 10 3NDK开发示例 AndroidNdkDemo示例的界面进行AndroidNDK开发一般要经过如下的步骤建立Application mk文件建立Android工程建立Android mk文件建立C源代码文件编译共享库模块 10 3NDK开发示例 建立Application mk文件建立步骤在apps目录中建立应用程序目录 AndroidNdkDemo示例的应用程序目录为ndk demo在ndk demo目录中建立一个空目录project 这个目录以后会用来存放Android工程在ndk demo目录中建立一个名为Application mk的文件 用来描述Android工程将调用的共享库AndroidNdkDemo示例的目录结构 10 3NDK开发示例 建立Application mk文件在进行NDK开发时 在应用程序目录中一定要有Application mk文件 用来声明Android工程需要调用的非托管模块 如静态库或共享库 AndroidNdkDemo示例的Application mk的代码如下第1行的变量APP PROJECT PATH表示Android工程所在的目录 在生产共享库文件后 APK将自动将共享库文件拷贝到 libs armeabi目录中 本示例将共享库文件拷贝到apps ndk demo project libs armeabi目录中 10 3NDK开发示例 建立Application mk文件第2行代码中的变量APP MODULES表示Android工程需要调用的非托管模块 如果存在多个非托管模块 使用空格进行分隔 本示例调用的非托管模块为add module 对应在后面涉及的Android mk文件Application mk的变量说明 10 3NDK开发示例 建立Android工程在project目录中建立Android工程时 需要取消复选框 Usedefaultlocation 并指定预先建立的project文件夹作为工程文件夹在建立AndroidNdkDemo工程后 修改main xml文件 添加一个id为display的TextView和一个id为add btn的Button按钮 10 3NDK开发示例 建立Android工程程序中的生产随机数和调用的代码在AndroidNdkDemo java文件中 下面是AndroidNdkDemo java文件的核心代码 10 3NDK开发示例 建立Android工程 10 3NDK开发示例 建立Android工程上面的代码有一个NDK开发的小技巧 在开发C C 的共享库前 可以使用具有相同和相近功能的Java函数进行替代 在代码第17行本应该调用共享库的add 函数 但为了便于开发和调试 在代码第25行到第27行 使用Java代码开发了一个功能相同的add 函数 这样即使在没有完成C C 的共享库开发前 也可以对这个Android工程进行界面部分的调试第16行和第23行注释掉的代码 就是在C C 的共享库开发完毕后需要使用的代码 其中第16行是动态加载共享库的代码 加载的共享库名称为add module 第23行用来声明共享库的函数 使用C C 开发的共享库必须有同名的函数 在共享库开发完毕后 取消第16行和第23行代码的注释 并注释掉第25行到第27行代码 这样程序就可以正常调用共享库内的函数进行加法运算 10 3NDK开发示例 建立Android mk文件建立C C 源代码文件前 首先需要在sources目录中建立模块目录 AndroidNdkDemo示例的模块目录为add module 这个模块目录的名称与Application mk文件中声明的模块名称相同add module目录中包含两个文件 Android mk和add module c 目录结构如下 10 3NDK开发示例 建立Android mk文件Android mk是为NKD编译系统准备的脚本文件 用来描述模块需要编译C C 文件的信息通常NKD编译系统会搜寻 NDK sources 目录中的所有Android mk文件 但如果程序开发人员将Android mk文件放置在下一级目录中 则需要在上一级目录中的Android mk文件添加如下代码 10 3NDK开发示例 建立Android mk文件下面来分析AndroidNdkDemo示例的add module模块的Android mk文件Android mk文件的代码如下 10 3NDK开发示例 建立Android mk文件每个Android mk文件都必须以第1行代码开始 变量LOCAL PATH用来定义需要编译的C C 源代码的位置 my dir由NKD编译系统提供 表示当前目录的位置 代码第3行的include CLEAR VARS 表示清空所有以LOCAL 开始的变量 例如LOCAL MODULE LOCAL SRC FILES LOCAL STATIC LIBRARIES等 但第1行定义的LOCAL PATH不在清空的范围内 因为所有的脚本都将粘贴到同一个GNUMake的执行上下文中 而且所有变量都是全局变量 因此必须在每次使用前清空所有以前用过的变量 10 3NDK开发示例 建立Android mk文件第5行代码变量LOCAL MODULE用来声明模块名称 模块名称必须唯一 而且中间不能够存在空格 NKD编译系统将会在模块名称前自动添加lib前缀 然后生产so文件 这里的模块名称为add module 生产的共享库文件名为libadd module so 但需要注意的是 如果程序开发人员使用具有lib前缀的模块名称 NKD编译系统将不再添加前缀 例如模块名称为libsub 生产的共享库文件名为libsub so 10 3NDK开发示例 建立Android mk文件第6行代码中的变量LOCAL SRC FILES表示编译模块所需要使用的C C 文件列表 但不需要给出头文件的列表 因为NKD编译系统会自动计算依赖关系 add module模块仅需要一个C文件 文件名为add module c 缺省情况下 结尾名为 c的文件是C语言源文件 结尾名为 cpp
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号