




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章AndroidNDK编程12.1JNI与NDK简介12.2NDK开发环境12.3NDK简单示例本章总结
12.1JNI与NDK简介
2.1.1JNI简介JNI(JavaNativeInterface),即Java原生接口,通过JNI可以在Java代码中调用C/C++等语言的代码,也可以在C/C++代码中调用Java代码。Java与C/C++通信框架如图12.1所示。此处需要注意的是:JNI是Java调用Native语言的一种特性,是属于Java的,与Android无直接关系。
图12.1Java与C/C++通信框架
Java具备跨平台的特点,导致了Java与本地代码交互的能力非常弱,而采用JNI之后,Java与本地代码交互的能力就会大大增强。除此之外,许多基于JNI的标准库以及相关的API可以供Java程序员使用,提高开发的效率。JNI框架允许Native层语言与Java层语言双向交互,给开发带来了极大的优势。
接下来了解一下JNI的实现步骤,具体如下所示。
(1)编写带有Native方法的Java类(即需要调用的本地方法);
(2)使用javac命令编译所编写的Java类(得到.class文件);
(3)使用javah+Java类名生成扩展名为h的头文件(.h文件);
(4)用C/C++实现Java中声明的Native方法;
(5)将C/C++编写的文件生成动态链接库(.so文件);
(6)通过Java命令执行Java程序,最终实现Java调用本地代码。
12.1.2NDK简介
NDK(NativeDevelopmentKit)是Android的一个开发工具包,与Java并无直接关系。它主要是用来快速开发C、C++的动态库,并自动将.so库文件和应用一起打包成APK。主要在Android的场景下使用JNI时会用到NDK。
NDK具有如下的特点:
1.性能方面
(1)运行效率高。在开发要求高性能的需求中,采用C/C++更加有效率,如使用本地代码(C/C++)执行算法,能大大提高算法的执行效率。
(2)代码安全性高。Java是半解释型语言,容易被反汇编后得到源代码,而本地有些代码类型(如C/C++)则不会,能提高系统的安全性。
2.功能方面
功能拓展性好,可方便地使用其他开发语言的开源库,除了Java的开源库,还可以使用开发语言(C/C++)的开源库。
3.使用方面
易于代码复用和移植,用本地代码(如C/C++)开发的代码不仅可在Android中使用,还可以嵌入其他类型平台上使用。
除上述特点之外,读者还需注意NDK提供的库比较有限,仅用于处理算法效率和敏感的问题,另外NDK还提供了交叉编译器,用于生成特定的CPU平台动态库。
接下来了解一下NDK的基本使用步骤,具体如下:
(1)配置好AndroidNDK开发环境;
(2)创建Android项目,并关联NDK;
(3)在项目中声明所需要调用的Native方法;
(4)使用C/C++实现在Android项目中声明的Native方法;
(5)通过ndk–bulid命令编译产生.so库文件;
(6)编译AndroidStudio工程,从而实现Android和本地代码的交互。
12.1.3JNI与NDK的关系
12.1.1节和12.1.2节讲述了JNI和NDK的概念、特点及使用步骤,读者对二者有了基本的认识,但是可能还是有许多读者学完之后仍不清楚两者之间的关系,下面通过表格的形式让读者对JNI与NDK之间的关系有一个比较直观的认识,如表12.1所示。
12.2NDK开发环境
首先下载并安装CMake和NDK,在AndroidStudio主界面点击File→Settings…→SystemSettings→AndroidSDK→SDKTools,选中NDK和CMake(如果有LLDB的话也可以一并选中安装),点击Apply进行下载安装,下载安装完成后,最右侧的Status栏中的内容会由Notinstalled变为Installed,如图12.2所示。
图12.2NDK及CMake下载安装
NDK是Android原生开发套件,主要是为了在Android应用中使用C和C++代码,前面已经详细介绍过NDK。读者在此处需要注意的是CMake,它是一款外部编译工具,可与Gradle搭配使用来编译原生库(如果读者只计划使用ndk-build,则可以不需要该组件)。另外上面提到的LLDB是AndroidStudio用于调试原生代码的调试程序,默认情况下,LLDB将与AndroidStudio一起安装。
下载安装完NDK和CMake后,需要配置一下NDK环境,在AndroidStudio主界面上点击File→ProjectStructure…→SDKLocation,在AndroidNDKlocation部分,选择NDK默认的安装路径,点击OK按钮即可,如图12.3所示。
图12.3AndroidNDKlocation
读者也可以在下载完成时通过perties文件查看SDK和NDK在电脑上的保存路径,如图12.4所示。并在电脑上找到NDK对应的路径,将其复制到上述AndroidNDKlocation部分也可。
图12.4perties文件内容
如果没有环境变量,那么再设置系统环境变量,右键点击计算机→属性→高级系统设置→环境变量→系统变量,新建一个系统变量,变量名为NDK_ROOT,变量值为NDK的路径,然后点击确定按钮即可,如图12.5所示。
图12.5新建系统变量
然后再在Path变量路径下添加NDK_ROOT变量,直接输入%NDK_ROOT%即可(注意%NDK_ROOT%后边需要加上分号),如图12.6所示。
图12.6编辑Path系统变量
最后,测试一下环境变量是否配置成功,进入cmd命令行,输入ndk-build回车,如果出现如图12.7所示的结果,则说明环境变量配置成功。
图12.7测试环境变量
接下来测试一下NDK开发环境是否配置成功。首先新建一个AndroidStudio工程,然后在SelectProjectTemplate界面中选择NativeC++,如图12.8所示。
图12.8选择工程模板
点击Next按钮进入工程配置界面,将Name修改为NDKTest,如图12.9所示。
图12.9configureproject
点击Next按钮,进入到如图12.10所示的界面,在C++Standard部分选择默认CMake设置的ToolchainDefault选项。
图12.10CustomizeC++Support界面
点击Finish按钮,完成新项目的创建。打开Project面板,选择Android视图。大家可以发现,NDKTest工程比之前的Android工程多了一个cpp文件夹,如图12.11所示。图12.11NDKTest工程目录结构
至此,大家对一个最简单的NDK工程有了初步的认识。接下来运行程序,运行结果如图12.12所示。大家可以看到App主界面中显示一段文字“HellofromC++”,表明在工程的Java程序中成功获取到C++程序中的数据,实现了二者的交互。图12.12NDKTest运行结果
最后总结一下从编译到运行示例的流程。
(1) Gradle:调用外部构建脚本,也就是CMakeLists.txt。
(2) CMake:根据构建脚本的指令去编译一个C++源文件,也就是native-lib.cpp,将编译后的文件放进共享对象库中,并将其命名为libnative-lib.so,然后Gradle将其打包到APK中。
(3)在运行期间,Android中的MainActivity会调用System.loadLibrary()方法,加载nativelibrary。而这个库的原生函数:stringFromJNI(),就可以为App所用了。
(4) Android中的MainActivity通过publicnativeStringstringFromJNI()的JNI接口调用stringFromJNI()函数,然后返回“HellofromC++”,并在主界面中更新TextView的显示。
如果读者想验证一下Gradle是否将nativelibrary打包进了APK文件,可以借助AndroidStudio上的APKAnalyzer。依次选择Build→AnalyzeAPK→app/build/outputs/apk/debug→app-debug.apk→ok,在AnalyzeAPK窗口中,选择lib/x86(笔者的ABI为x86,Android目前支持七种ABI,所以读者的ABI可能是armeabi、armeabi-v7a等剩余的六种,读者根据自己平台的情况进行选择),就可以看见libnative-lib.so文件,结果如图12.13所示。
图12.13APKAnalyzer
12.3NDK简单示例
首先创建一个不引进C++库的demo,选择EmptyActivity,然后点击Next按钮,修改工程名为NDKDemo,点击Finish按钮。工程结构如图12.14所示。这是一个大家最熟悉、最简单的Android工程,没有与NDK相关的文件。
图12.14NDKDemo工程结构
接下来要在该工程的基础上进行NDK开发。首先需要为该程序部署C/C++环境以及Cmake编译环境。将Android工程切换到Project结构视图下,依次点击app→src→main,在main文件夹下新建cpp文件夹,并在cpp文件夹下新建CMakeLists.txt,如图12.15所示。
图12.15cpp及CMakeLists.txt
然后点击File→linkC++ProjectwithGradle,在弹出来的对话框中,BuildSystem选择CMake,ProjectPath选择CMakeLists.txt的路径,点击OK,如图12.16所示。此处需要注意:CMakeLists.txt文件一定要放在cpp文件夹下面,否则编译会报错。
图12.16CMakeLists.txt文件路径
配置完CMakeLists.txt后,发现工程报错:Causedby:org.gradle.api.InvalidUserDataException:NDKnotconfigured.DownloaditwithSDKmanager.PreferredNDKversionis'20.0.5594570'.Log:E:\ASProject\NDKDemo\app\.cxx\ndk_locator_record.json。可以看到错误是由于没有配置NDK引起的,此时要为工程配置NDK环境。在12.2节讲过NDK环境的配置方法,即在AndroidStudio主界面点击File→ProjectStructure…→SDKLocation,在AndroidNDKlocation部分,选择NDK默认的安装路径,点击OK按钮即可。配置完成后,工程便不再报错,此时app文件夹下又多了个.cxx文件夹,且文件夹下的ndk_locator_record.json文件中包含NDK配置路径,具体如图12.17所示。
图12.17app文件夹
然后可以查看一下app文件夹下的build.gradle文件,里边已经自动生成CMakeLists.txt文件路径,如图12.18所示。图12.18gradle文件中CMakeLists.txt文件路径
配置完后,运行程序,结果如图12.19所示。
在主界面的文本框中随机输入5个数,比如:25、12、66、52、11,然后点击冒泡排序按钮,结果如图12.20所示。图12.19程序主界面图12.20冒泡排序结果
NDK还有许多高级的用法,本书只是讲了最基本的用法,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国酒杯(酒具)市场运营现状及投资前景规划研究报告
- 2025-2030年中国西乐器制造市场发展状况及前景趋势分析报告
- 岳西事业编招聘年考试真题及答案解析事业单位真题
- 长江大学文理学院《区域分析方法计量地理学》2023-2024学年第二学期期末试卷
- 2025甘肃省建筑安全员《A证》考试题库及答案
- 常州工程职业技术学院《化工环保与安全概论》2023-2024学年第二学期期末试卷
- 石家庄城市经济职业学院《第二语言教学法》2023-2024学年第二学期期末试卷
- 湖南安全技术职业学院《商业伦理与会计职业操守》2023-2024学年第二学期期末试卷
- 汕头大学《财政与金融》2023-2024学年第二学期期末试卷
- 浙江师范大学行知学院《公共部门绩效评估》2023-2024学年第二学期期末试卷
- 全隐框玻璃幕墙施工方案
- 十八项医疗核心制度详解培训课件
- 五年级上册信息技术教学计划华科版
- 机器人传感器PPT完整全套教学课件
- 初一语文下册:阅读理解知识点整理
- 营销部安全生产责任制
- CSM工法双轮铣水泥土搅拌墙专项施工方案
- 定点医疗机构接入验收申请表
- 小羊诗歌大全1479首(小羊喝水扩句)
- 2022-2023学年辽宁省鞍山市普通高中高一年级下册学期第一次月考数学(A卷)试题【含答案】
- 中国农村居民储蓄行为研究共3篇
评论
0/150
提交评论