【入门指南】JNI/NDKK入门指南之正确姿势
JNI/NDK入门指南之正确姿势了解JNI和NDK
Android JNI/NDK入门指南目录
引言
(资料图片)
随着Android生态的发展,越来越多的行业开始使用Android操作系统,这就造就了对Android设备的应用性能和安全要求越来越高,随之而来的对JNI/NDK开发的需求也越来越大。虽然网上或者很多书籍都有关于此方面的讲解,但是都是上来直奔主题说怎么使用JNI/NDK,而没有将啥是JNI和NDK讲解清楚。所以导致很多读者虽然会用,但是依然没有搞明白JNI/DNK的基本理论知识,那么今天我们就来对JNI/NDK详细掰扯掰扯它们之间的联系和区别。
一. 细说JNI
1.1 JNI是什么?
JNI(Java Native Interface,JAVA原生接口)。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。通俗一点讲就是在 Java代码 里调用 C/C++等语言的代码 或 C/C++代码调用 Java 代码。 注意:JNI(Java Native Interface)是SUN定义的一套标准接口,如Dalvik, Apache Harmony 项目…等 Java虚拟机,都会实现 JNI 接口,供本地(C/C++)应用与Java VM互调,即JNI 最重要的好处是它没有对底层 Java 虚拟机的实现施加任何限制。所以JNI是Java语言的特点,和Android没有关系。
1.2 JNI优点(即为啥要用JNI)
首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低。然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能。接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率。
通过对上面的几点的总结,可以归纳出一句话就是规避Java语言的弱点,然后利用C/C++的优点。
1.3 JNI缺点
任何事情都是由两面性的,所以JNI也不例外,所以在决定使用 JNI之前,我想各位一定要了解JNI那些缺点,如果能接受和容纳那就可以放心大胆的使用了。
使用JNI细小的错误都能让这个JVM不稳定,并且这些错误很难再现和调试
使用JNI的应用失去了JAVA本身提供的不同平台的可移植性。
JNI 框架不提供自动的垃圾回收机制,所以这部分代码要考虑内存的释放
1.4 JNI技术的实现原理
JNI技术分为两部分:Java端和C语言端。且以Java端为主导。
首先,Java程序员在Java端定义一些native方法,并将这些方法以C语言头文件的方式提供给C程序员。然后,C程序员使用C语言,来实现Java程序员提供的头文件中定义的函数。接着,C程序员将函数打包成一个库文件,并将库文件交给Java程序员。最后,Java程序员在Java程序中导入库文件,然后调用native方法。
在Java程序执行的时候,若在某个类中调用了native方法,则虚拟机会通过JNI来转调用库文件中的C语言代码
1.5 JNI使用步骤简介
虽然本篇章主要是介绍JNI/NDK的理论知识,但是还是顺带简介一下在JAVA开发中怎么使用JNI,步骤如下:
在Java中声明Native方法(即需要调用的本地方法)编译上述 Java源文件javac(得到 .class文件)通过 javah 命令导出JNI的头文件(.h文件)使用 Java需要交互的本地代码 实现在 Java中声明的Native方法如 Java 需要与 C++ 交互,那么就用C++实现 Java的Native方法编译.so库文件通过Java命令执行 Java程序,最终实现Java调用本地代码
二. 细说NDK
2.1 NDK是什么
NDK全称:Native Development Kit,是Android的妈咪谷歌为我们提供的一套开发工具。正所谓谷歌出品,必属精品,NDK是一系列工具的集合,它有很多作用。
首先,NDK可以帮助开发者快速开发C(或C++)的动态库。其次,NDK集成了交叉编译器。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
NDK的出现为我们在Android开发中使用JNI提供了非常方便的工具套间,这里不得不给谷歌一个赞。
2.2 NDK特点
NDK具有如下图示的特点,这边我借鉴了Android:JNI 与 NDK到底是什么?(含实例教学)的总结,这里我就不再进行自我总结了,因为他的总结确实不错。
3. 补充知识点,C/C++语言常见术语
提到了JNI,所以不得不对一些C/C++里面常见的术语进行一些基本的解释,这样对于更加深入的了解JNI是必不可少的。
3.1 库函数
为了代码重用,在C语言中提供了一些常用的、用于执行一些标准任务(如输入/出)的函数,这些函数事先被编译,并生成目标代码,然后将生成的目标代码打包成一个库文件,以供再次使用。 库文件中的函数被称为库函数,库文件被称为函数库。
在Windows中C语言库函数中的中间代码都是以.obj为后缀的。Linux中是以 .o为后缀。 提示:单个目标代码是无法直接执行的,目标代码在运行之前需要使用连接程序将目标代码和其他库函数连接在一起后生成可执行的文件。 Windows下.dll的文件 , linux下 .so .a的文件.。
3.2 头文件
头文件中存放的是对某个库中所定义的函数、宏(define)、类型、全局变量等进行声明,它类似于一份仓库清单。若用户程序中需要使用某个库中的函数,则只需要将该库所对应的头文件include到程序中即可。
头文件中定义的是库中所有函数的函数原型。而函数的具体实现则是在库文件中。简单的说:头文件是给编译器用的,库文件是给连接器用的。在连接器连接程序时,会依据用户程序中导入的头文件,将对应的库函数导入到程序中。头文件以.h为后缀名。
3.3 函数库
函数库一般分为动态库和静态库两种。
动态库:在编译用户程序时不会将用户程序内使用的库函数连接到用户程序的目标代码中,只有在运行时,且用户程序执行到相关函数时才会调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。静态库:在编译用户程序时会将其内使用的库函数连接到目标代码中,程序运行时不再需要静态库。使用静态库生成可执行文件比较大。
在Linux中:
静态库命名一般为:lib+库名+.a 。如:libcxy.a 其中lib说明此文件是一个库文件,cxy是库的名称,.a说明是静态的。动态库命名一般为:lib+库名+.so 。.so说明是动态的。
3.4 交叉编译
检查编译是指将中间代码连接成当前计算机可执行的二进制程序时,连接程序会根据当前计算机的CPU、操作系统的类型来转换。 根据运行的设备的不同,可以将cpu分为:
arm结构 :主要在移动手持、嵌入式设备上。x86结构 : 主要在台式机、笔记本上使用。如Intel和AMD的CPU 。
若想在使用了基于x86结构CPU的操作系统中编译出可以在基于arm结构CPU的操作系统上运行的代码,就必须使用交叉编译。 交叉编译:在一个平台下编译出在另一个平台中可以执行的二进制代码。Google提供的NDK就可以完成交叉编译的工作。
总结
通过前面详细的讲解,我想各位读者应该对JNI/NDK有一个清晰的认识了,如果还不清晰那只能说臣妾真的做的不到了(开玩笑了)。下面让我在最后用一句话总结那就是JNI是一种Java开发中使用到的技术手段,而NDK则是Android妈咪谷歌提供的一种使用JNI的开发工具套件,这样总结下来是不是so easy了。青山不改绿水长流,各位江湖见!
标签:
相关推荐:
最新新闻:
- 环球热消息:苹果cmsv10版二次开发网站源码分享 二开功能介绍
- linux实用教程复习题 linux上机复习题部分答案-当前快报
- 电脑上如何批量下载QQ空间图片?电脑版QQ空间图片批量下载
- 怎样释放计算机网络宽带限制?解除电脑网速限制的方法
- 【聚看点】JVM常用配置参数有哪些?40道面试题解答
- 【入门指南】JNI/NDKK入门指南之正确姿势
- 三相PMSM的转子结构有哪些特征?三相PMSM的转子结构特征 |要闻
- 如何在亚马逊官网注册亚马逊账号?(免费版)-世界热推荐
- javascript学习笔记:get和post方法
- 【环球新要闻】笔记软件分享 为知笔记6年深度体验(上)
- 每日播报!如何在Flash中做旋转转速?MC的详细运用
- 膜结构车棚使用的材料有哪些?车棚膜结构使用膜材选择分析解析
- java strut2通配符 Struts2的通配符配置方式
- 《蝙蝠侠前传3:黑暗骑士崛起》蓝光高清720P1080P下载
- py前端构建学习中的pcrbox第一版:天天热议
- 时间频率同步的方法有哪些?时间频率同步的方法-环球热资讯
- 凡音L2怎么样?凡音L2蓝牙后挂耳机评测|天天观速讯
- 世界最资讯丨天天动听有电脑版吗?免费的手机音乐播放器下载
- 每日消息!电脑配机有哪些注意事项?电脑配机方案方法详
- 什么是负载均衡器?负载均衡器有什么作用?-今热点
- Windows系统如何使用光标键来移动?windows使用光标键方法 全球微头条
- 怎么设置电信光纤猫的无线网络?光纤猫的无线网络设置流程
- 当前速递!虚拟主机空间是什么?虚拟主机空间有什么用途?
- 【全球播资讯】iPhone手势插件Activator怎么用?详细的使用方法
- 环球快播:蚂蚁森林给别人浇水有什么好处?详细介绍
- 全球观点:怎样修复ie浏览器?IE游览器的修复方法
- 通过Chrome来知道提交加价的请求应该是什么?_今日观点
- 索尼电视机故障怎么办?索尼电视机维修方法|全球观热点
- ro商用纯水机净化效果好不好?ro商用纯水机特点介绍
- 母亲节送什么好_母亲节送妈妈七大类型礼物_每日视点
- C语言中的double是什么意思?直击PHP的异常和错误处理
- “平均数”到底是什么意思?加权平均数又是什么意思?_世界独家
- 手机wifi连接上但不能上网怎么办?解决方法步骤 重点聚焦
- javascript索引是什么?javascript索引的概念及技巧
- 当前热门:二手笔记本多少钱?二手笔记本价格详解
- 【焦点热闻】世界上最简洁的人脸识别库:face_recognition
- 触手tv怎么直播?触手tv直播的方法-当前焦点
- 电子硬盘多少钱?市场上电子硬盘价格详情
- 舍入模式有哪些?八种舍入模式的解释 每日视讯
- 如何下载Navicat数据库管理编辑软件?如何打开.db数据库文件? 世界头条
- FB是什么意思?PCB原理图中的FB是什么意思?
- 美能达283复印机扫描怎么设置?柯尼卡美能达打印机的设置方法
- QQ象棋java通用版怎么下载?QQ中国象棋官方免费版下载
- 【全球速看料】启动定时器t0的工作指令是什么?PLC通电延时定时器(TON)应用举例
- dm-verity是如何保证安全的?dm-verity-ramdisk文件系统校验的解决方法:今日关注
- 怎么修改苹果id密码?苹果id密码修改教程-全球微资讯
- 马赛克电视墙如何设计?马赛克电视墙设计要点|当前视讯
- 豆丁网怎么免费下载?豆丁网文档下载软件:当前通讯
- 如何进行正交试验设计?试验设计—正交表的使用方法:每日时讯
- 全球最资讯丨如何在windows上交叉编译ffmpeg?具体操作步骤
- 渠道商预售 AMD游戏神U锐龙7000 144MB缓存版:每日消息
- 兄弟管道官网发现《超级马里奥兄弟大电影》隐藏海报 全球快消息
- 超狂身材曲线太过分 印尼电竞女选手火辣至极
- 《大富翁11》现已完全支持Steam Deck-焦点热议
- 更新iOS 谷歌服务大范围无法访问
- 情人节惊喜福利:购影驰RTX 30显卡,送穿越火线大礼包 天天快看点
- 优化碰撞监测 苹果iOS16更新再次尝试-今亮点
- 环球观察:潮邦集成灶怎么样?真实用户有话说!
- 世界快资讯丨索尼FE 50mm F1.4 GM镜头外观曝光
- 全球快资讯:2020最新新年对联大全_春节对联集锦大全
- 看视频软件app排行榜_看视频软件
- 2019立秋为什么吃饺子 立秋适合吃饺子吗
- 《战神》总监承认同伴破坏解谜体验:做的时候没想到-每日速递
- 2023年情人节单日票房破两亿 《满江红》领跑|当前速递
- 每日速看!永安林业违反会计准则 被出具警示函
- 世界最资讯丨XGPU和EA Play会员已可试玩《狂野之心》 时长约10小时
- 【世界热闻】上海迪士尼度假区与三星电子达成推广合作, 庆祝三星新品手机发布
- 程序员的好帮手?网友开始尝试用ChatGPT开发游戏
- 索尼正在研究如何把PS5塞进桌斗里:抱着送人太沉了|资讯
- 天天要闻:早期版的《战神5》 奎爷曾被雷神杀死
- “超时空办公”时代已来 联想发布智慧办公白皮书 每日时讯
- 【聚看点】拓界影像稳劲性能 三星Galaxy S23系列旗舰手机国内发布
- 即时:外国女孩穿汉服COS东方美人 网友感慨:这波中华文化输出赢麻了
- 滤镜景点诈骗又来了!7朵郁金香撑起上海武康路流量
- 速递!“逆城市”建设类游戏《伊始之地》宣传片公开