版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 Android NDK开发,本章学习目标:,了解Android NDK的用途 掌握Android NDK编译环境的安装与配置方法 掌握Android NDK的开发方法,10.1 NDK简介,Android NDK (Android Native Development Kit)是一系列的开发工具,允许程序开发人员在Android应用程序中嵌入C/C+语言编写的非托管代码 Android NDK优势 解决了核心模块使用托管语言开发执行效率低下的问题 允许程序开发人员直接使用C/C+源代码,极大的提高了Android应用程序开发的灵活性 Android NDK不足 增加程序的例如信号处理
2、或物理仿真)使用非托管代码运行效率最高,复杂性,增加了程序调试的难度 CPU运算量大和内存消耗较少的部分(因此并不是所有的核心部分都适合使用C/C+语言编写,10.1 NDK简介,Android NDK Android NDK的版本是1.5,集成了交叉编译器,支持ARMv5TE处理器指令集、JNI接口和一些稳定的库文件 Android NDK仅支持Android SDK 1.5版本,因此1.0和1.1版本的应用程序不能够使用Android NDK Android NDK提供一系列的说明文档、示例代码和开发工具,指导程序开发人员使用C/C+语言进行库文件开发,并提供便捷工具将库文件打包到apk文
3、件中,10.2 NDK编译环境,Android NDK编译环境支持Windows XP、Linux和MacOS,本书仅介绍Windows系统的编译环境配置方法 Windows系统的编译环境配置方法 下载Android NDK的安装包 下载并安装Cygwin 配置Cygwin的NDK开发环境 测试开发环境是否可以正常工作,10.2 NDK编译环境,下载Android NDK的安装包 在Google的官方网站下载Android NDK的安装包,下载地址是,10.2 NDK编译环境,下载Android NDK的安装包 将下载的ZIP文件解压缩到用户的Android开发目录中,作者将Android N
4、DK解压到E:Android目录中,ZIP文件中包含一层目录,因此Android NDK的最终路径为E:Androidandroid-ndk-1.5_r1,10.2 NDK编译环境,下载并安装Cygwin Android NDK目前还不支持在Windows系统下直接进行交叉编译,因此需要在Windows系统下安装一个Linux的模拟器环境Cygwin,完成C/C+代码的交叉编译工作 Android NDK要求GNU Make的版本高于或等于3.18,之前的版本并没有经过测试,因此需要安装较新版本的Cygwin Cygwin的最新版本可以到官方网站下载,也可以到中文的映像网站下载,10.2 ND
5、K编译环境,下载并安装Cygwin 在Cygwin的安装过程中,需要将Devel下的gcc和make的相关选项选上,否则Cygwin将无法编译C/C+代码文件,10.2 NDK编译环境,配置Cygwin的NDK开发环境 在缺省情况下,Cygwin安装在C盘的根目录下,修改C:cygwinhomeusername.bash_profile文件,username会根据用户使用的用户名称而变化 在.bash_profile文件的结尾处添加如下代码 上面的代码说明了Android NDK所在的目录,目录是e盘android/android-ndk-1.5_r1 如果Android NDK安装在c盘的T
6、estAndroid/android-ndk-1.5_r1中,则上面的代码则应该为,10.2 NDK编译环境,测试开发环境是否可以正常工作 首先启动Cygwin,然后切换到/build目录中,运行host-setup.sh文件 如果运行结果如下图,说明Android NDK的开发环境已经可以正常工作了 Android NDK的编译环境已经安装配置完毕,10.2 NDK编译环境,Android NDK的目录结构 在android-ndk-1.5_r1目录中,包含5个子目录和2个文件 apps目录是Android工程的保存目录,子目录hello-jni和tow-libs是NDK自带的两个示例目录
7、build目录保存了交叉编译工具、编译脚本和配置文件 docs目录是帮助文档的保存目录 out目录是交叉编译的输出目录,保存输出的so文件,10.2 NDK编译环境,Android NDK的目录结构 sources目录是C/C+源代码文件的保存目录,其下的hello-jni和tow-libs子目录,分别保存了NDK自带示例所需要的C/C+源代码文件 GNUmakfile文件和README.TXT文件分别是make工具的配置文件和NDK的说明文件,10.2 NDK编译环境,Android NDK的目录结构 docs目录中的帮助文件说明,10.2 NDK编译环境,Android NDK自带两个示例
8、hello-jni和tow-libs hello-jni是一个非常简单的例子,非托管代码实现了一个可以返回字符串的共享库,Android工程调用这个共享库获取字符串,然后显示在用户界面上 tow-libs是稍微复杂一些的例子,使用非托管代码实现了一个数学运算的共享库,Android工程动态加载这个共享库,并调用其中的函数,函数功能是通过使用静态库实现的,10.3 NDK开发示例,在进行NDK开发时,一般需要同时建立Android工程和C/C+工程,然后使用NDK编译C/C+工程,形成可以被调用的共享库,最后共享库文件会被拷贝到Android工程中,并被直接打包到apk文件中 后面的内容将And
9、roidNdkDemo示例说明如何进行Android NDK开发 AndroidNdkDemo是一个进行加法运算的示例,程序会随机产生两个整数,然后调用C语言开发的共享库对这两个整数进行加法运算,最后将运算结果显示在用户界面上,10.3 NDK开发示例,AndroidNdkDemo示例的界面 进行Android NDK开发一般要经过如下的步骤 建立Application.mk文件 建立Android工程 建立Android.mk文件 建立C源代码文件 编译共享库模块,10.3 NDK开发示例,建立Application.mk文件 建立步骤 在apps目录中建立应用程序目录,AndroidNdk
10、Demo示例的应用程序目录为ndk-demo 在ndk-demo目录中建立一个空目录project,这个目录以后会用来存放Android工程 在ndk-demo目录中建立一个名为Application.mk的文件,用来描述Android工程将调用的共享库 AndroidNdkDemo示例的目录结构,10.3 NDK开发示例,建立Application.mk文件 在进行NDK开发时,在应用程序目录中一定要有Application.mk文件,用来声明Android工程需要调用的非托管模块(如静态库或共享库) AndroidNdkDemo示例的Application.mk的代码如下 第1行的变量AP
11、P_PROJECT_PATH表示Android工程所在的目录,在生产共享库文件后,APK将自动将共享库文件拷贝到libsarmeabi目录中,本示例将共享库文件拷贝到appsndk-demoprojectlibsarmeabi目录中,10.3 NDK开发示例,建立Application.mk文件 第2行代码中的变量APP_MODULES表示Android工程需要调用的非托管模块,如果存在多个非托管模块,使用空格进行分隔。本示例调用的非托管模块为add-module,对应在后面涉及的Android.mk文件 Application.mk的变量说明,10.3 NDK开发示例,建立Android工程
12、 在project目录中建立Android工程时,需要取消复选框“Use default location”,并指定预先建立的project文件夹作为工程文件夹 在建立AndroidNdkDemo工程后,修改main.xml文件,添加一个id为display的TextView和一个id为add_btn的Button按钮,10.3 NDK开发示例,建立Android工程 程序中的生产随机数和调用的代码在AndroidNdkDemo.java文件中,下面是AndroidNdkDemo.java文件的核心代码,10.3 NDK开发示例,建立Android工程,10.3 NDK开发示例,建立Andro
13、id工程 上面的代码有一个NDK开发的小技巧,在开发C/C+的共享库前,可以使用具有相同和相近功能的Java函数进行替代。在代码第17行本应该调用共享库的add()函数,但为了便于开发和调试,在代码第25行到第27行,使用Java代码开发了一个功能相同的add()函数,这样即使在没有完成C/C+的共享库开发前,也可以对这个Android工程进行界面部分的调试 第16行和第23行注释掉的代码,就是在C/C+的共享库开发完毕后需要使用的代码,其中第16行是动态加载共享库的代码,加载的共享库名称为add-module;第23行用来声明共享库的函数,使用C/C+开发的共享库必须有同名的函数。在共享库开
14、发完毕后,取消第16行和第23行代码的注释,并注释掉第25行到第27行代码,这样程序就可以正常调用共享库内的函数进行加法运算,10.3 NDK开发示例,建立Android.mk文件 建立C/C+源代码文件前,首先需要在sources目录中建立模块目录,AndroidNdkDemo示例的模块目录为add-module,这个模块目录的名称与Application.mk文件中声明的模块名称相同 add-module目录中包含两个文件,Android.mk和add-module.c,目录结构如下,10.3 NDK开发示例,建立Android.mk文件 Android.mk是为NKD编译系统准备的脚本文
15、件,用来描述模块需要编译C/C+文件的信息 通常NKD编译系统会搜寻$NDK/sources/*/目录中的所有Android.mk文件,但如果程序开发人员将Android.mk文件放置在下一级目录中,则需要在上一级目录中的Android.mk文件添加如下代码,10.3 NDK开发示例,建立Android.mk文件 下面来分析AndroidNdkDemo示例的add-module模块的Android.mk文件 Android.mk文件的代码如下,10.3 NDK开发示例,建立Android.mk文件 每个Android.mk文件都必须以第1行代码开始,变量LOCAL_PATH用来定义需要编译的C
16、/C+源代码的位置,my-dir由NKD编译系统提供,表示当前目录的位置。代码第3行的include $(CLEAR_VARS)表示清空所有以LOCAL_开始的变量,例如LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等,但第1行定义的LOCAL_PATH不在清空的范围内。因为所有的脚本都将粘贴到同一个GNU Make的执行上下文中,而且所有变量都是全局变量,因此必须在每次使用前清空所有以前用过的变量,10.3 NDK开发示例,建立Android.mk文件 第5行代码变量LOCAL_MODULE用来声明模块名称,模块名称必须唯一,而且中间不
17、能够存在空格。NKD编译系统将会在模块名称前自动添加lib前缀,然后生产so文件。这里的模块名称为add-module,生产的共享库文件名为libadd-module.so。但需要注意的是,如果程序开发人员使用具有lib前缀的模块名称,NKD编译系统将不再添加前缀,例如模块名称为libsub,生产的共享库文件名为libsub.so,10.3 NDK开发示例,建立Android.mk文件 第6行代码中的变量LOCAL_SRC_FILES表示编译模块所需要使用的C/C+文件列表,但不需要给出头文件的列表,因为NKD编译系统会自动计算依赖关系。add-module模块仅需要一个C文件,文件名为add
18、-module.c。缺省情况下,结尾名为.c的文件是C语言源文件,结尾名为.cpp的文件是C+语言源文件 第8行代码include $(BUILD_SHARED_LIBRARY)表示NKD编译系统构建共享库,如果变量BUILD_SHARED_LIBRARY更改为BUILD_STATIC_LIBRARY,则表示需要NKD编译系统构建静态库,10.3 NDK开发示例,建立C源代码文件 根据Android.mk文件的声明,add-module模块仅包含一个C源代码文件add-module.c。add-module.c文件的作用是实现两个整数加法运算功能,全部代码如下,10.3 NDK开发示例,建立C
19、源代码文件 第1行代码引入的是JNI(Java Native Interface)的头文件 第3行代码是函数名称,jlong表示Java长型整数,Java_edu_hrbeu_AndroidNdkDemo_AndroidNdkDemo_add的构成为Java_,其中的名称和参数要与AndroidNdkDemo.java文件定义的函数一致,AndroidNdkDemo.java文件定义的函数为public native long add(long x, long y) 第5行代码用来返回加法运算结果,10.3 NDK开发示例,编译共享库模块 首先启动cygwin,然后切换到Androd NDK的
20、主目录下,键入如下的编译命令 ndk-demo是apps目录下的应用程序目录名称。在指定应用程序(目录)名称后,NKD编译系统会首先找到目录中的Application.mk文件,根据Application.mk文件的信息,确定该Android共享需要使用add-module模块;然后在sources目录中搜索所有Android.mk文件,在找到与add-module模块匹配的Android.mk文件后,根据Android.mk文件提供的信息编译指定的C/C+源代码文件,形成共享库文件;最后将生产的共享库文件拷贝到Android工程的指定目录中,10.3 NDK开发示例,编译共享库模块 目前Androi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西南宁市军粮供应有限公司招聘3人笔试历年典型考点题库附带答案详解
- 2025广东佛山市顺北智慧管理有限公司副总经理招聘总笔试历年备考题库附带答案详解
- 2025年榆林市公共交通总公司招聘(57人)笔试历年备考题库附带答案详解
- 2025安康紫阳县农村供水管理有限公司招聘(21人)笔试历年典型考点题库附带答案详解
- 2025四川德阳市广安发展工程建设有限公司第二批项目合同制员工招聘笔试笔试历年典型考点题库附带答案详解
- 建瓯市赴闽南师范大学、福建师范大学招聘2026年紧缺急需专业教师的备考题库及参考答案详解一套
- 陕西青年职业学院《天然药物认知与创新实践》2024-2025学年第二学期期末试卷
- 机修内部管理制度
- 机关内部外出培训制度
- 机关内部绩效奖惩制度
- 2026年苏州工业职业技术学院单招职业技能测试必刷测试卷附答案
- 萨克斯独奏回家教案
- Unit5OldtoysPartBLet'stalkLet'slearn(课件)-人教PEP版英语三年级下册
- 津17SZ-9 天津市市政基础设施工程施工图设计审查要点 热力篇
- 历史遗憾读书分享
- 2025年春季北燃实业集团校园招聘考前自测高频考点模拟试题及参考答案详解一套
- 结构健康监测技术
- GB/T 17219-2025生活饮用水输配水设备、防护材料及水处理材料卫生安全评价
- 移动l1认证考试题库及答案
- 湖南土地复垦管理办法
- 环保合规成本核算-洞察及研究
评论
0/150
提交评论