将 so|JNI|NDK 之间的关系说明白
最近在了解公司历史的发展,发现了公司产品中几乎都要使用
so
文件,不禁好奇这个so
到底是何方神圣。
so 文件
so
是shared object
的缩写,见名思义就是共享的对象,机器可以直接运行的二进制代码。so
主要存在于Unix
和Linux
系统中。【参考:安卓so文件是什么,又是如何开发出来的呢? 】
它是c/c++
实现的功能函数集合,并对外提供标准的接口,外层可以通过这个接口调用c/c++
的代码。在Android
系统上普遍用于调用系统的硬件接口。
那么,Android
系统为什么要使用.so
文件呢?
Android
系统应用基本都是基于Java
语言开发,而Java
语言是不能直接访问Android
系统底层的硬件接口。而Android
系统中可以通过JNI
和硬件访问服务
去访问系统底层的硬件接口。比如:开启蓝牙、关闭蓝牙等
这里还有一个问题:为什么 Java
不能直接访问Android
系统底层的硬件呢?
Java
语言是跨平台的。【个人想法】:跨平台就会导致最后使用的平台是不确定的,因此要访问的底层硬件接口也是不确定的。Android
是基于Linux
系统,而有些Linux
系统调用是不支持Java
的,比如ioctl
,只能C/C++
才能调用。【参考:Android硬件访问服务(一)
"使用JNI直接操作硬件"】
既然知道了Android
系统中可以通过 JNI
和 硬件访问服务
去访问系统底层的硬件接口。
那么先来了解一下什么是JNI
吧
JNI
定义:
Java Native Interface
,即Java
本地接口
作用: 使得Java 与 本地其他类型语言(如C、C++
)交互
即在Java
代码 里调用C、C++
等语言的代码 或C、C++
代码调用Java
代码
特别注意:
JNI
是Java
调用Native
语言的一种特性JNI
是属于Java
的,与Android
无直接关系
JNI
代码经过编译之后在Unix/Linux
系统上就会生成 .so
文件,通过调用Java
代码调用.so
中的接口方法即可实现硬件的访问。
JNI
相关的内容还是比较复杂的,可以自行搜索了解,这里只是简单介绍。
可以参考这两篇系列【JNI详解---从不懂到理解 】,【Android JNI(一)——NDK与JNI基础】
JNI
方式去访问硬件有一个弊端,就是只能一个应用调用一个硬件接口,而多个应用去调用该硬件接口就会出现冲突,那么硬件访问服务
的方式就是解决JNI
的弊端。
硬件访问服务
的定义如下:
访问硬件资源的程序只能并且只有一个,我们称之为
System Server
, 其它要访问这个硬件资源的APP
必须要给Server
发请求,由Server
间接的操作硬件,从而实现资源的访问。这个就称之为硬件访问服务。【参考:Android访问硬件的方法】
更多硬件访问服务的资料
:
【Android硬件访问服务-Service】
【Android驱动(一)硬件访问服务学习之(二)Android通过硬件访问服务访问硬件】
在 Android
系统下 JNI
可以通过NDK
快速实现。那么NDK
又是什么呢?
NDK
NDK
全称:Native Develop Kit
,是Android
的一个工具开发包NDK
是属于Android
的,与Java
并无直接关系.
使用教程【NDK 入门指南】
通过Android Studio
编译之后就可以生成 .so
文件,之后就可以愉快的将 .so
文件集成到项目中了。
总结
我们首要目的就是要了解.so
文件的作用是用来访问系统底层的硬件接口,而Android
应用基本都是Java
开发,而Java
不支持直接访问硬件,但是Android
提供了两种方式去访问硬件接口:JNI
和硬件访问服务
。JNI
的方式编译后会产生.so
文件。同时Android
还给开发者提供了NDK
这个开发工具包,开发者可以使用NDK
快速实现 JNI
的功能。
将 so|JNI|NDK 之间的关系说明白的更多相关文章
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C ...
- Android JNI&NDK编程小结及建议
前言 由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签 ...
- JNI/NDK开发指南(二)——JVM查找java native方法的规则
通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...
- JNI/NDK开发指南(开山篇)
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...
- JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
JNI/NDK Java调用C/C++前言 通过第三篇文章讲解在实际的开发过程中Java层调用C/C++层的处理流程.其实我们在很大的业务里也需要C/C+ +层去调用Java层,这两层之间的相互调用 ...
- JNI/NDK开发
公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.J ...
- .NET Core与.NET Framework、Mono之间的关系
随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...
- .NET Core 和 .NET Framework 之间的关系
引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...
- 实体之间的关系【Entity Relationships】(EF基础系列篇9)
Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...
随机推荐
- Micrometer 快速入门
Micrometer为最流行的监控系统提供了一个简单的仪表客户端外观,允许仪表化JVM应用,而无需关心是哪个供应商提供的指标.它的作用和SLF4J类似,只不过它关注的不是Logging(日志),而是a ...
- Matplotlib散点图、条形图、直方图-02
对比常用统计图 折线图: 特点:能够显示数据的变化趋势,反映事物的变化情况.(变化) 直方图: 特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计) 条形图: 特点:绘制离散的数据,能够一眼 ...
- Android 正 N 边形圆角头像的实现
卖一下广告,欢迎大家关注我的微信公众号,扫一扫下方二维码或搜索微信号 stormjun94(徐公码字),即可关注. 目前专注于 Android 开发,主要分享 Android开发相关知识和一些相关的优 ...
- 使用file_get_contents() 发送GET、POST请求
服务器端执行HTTP请求,大家经常使用的就是CURL,curl工具的确是很好的数据文件传输工具,那么除此之外还有其他的工具能实现这个功能吗? 现在为你介绍一个很常见的工具 file_get_conte ...
- java算法基础范例
题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3 ...
- 多智能体系统(MAS)简介
1.背景 自然界中大量个体聚集时往往能够形成协调.有序,甚至令人感到震撼的运动场景,比如天空中集体翱翔的庞大的鸟群.海洋中成群游动的鱼群,陆地上合作捕猎的狼群.这些群体现象所表现出的分布.协调.自 ...
- 对cpu与load的理解及线上问题处理思路解读
前言 2019双11还有不到2个月就要到来了,大家也都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高.因此趁着这个时机正好再好好学习.巩固一下cpu和load的概念,为双11做准 ...
- Git初始化项目 和 Gitignore
初始化init: git init git status git add . git commit -am "init projrct" 添加远程仓库: git remote ad ...
- 十分钟快速学会Matplotlib基本图形操作
在学习Python的各种工具包的时候,看网上的各种教程总是感觉各种方法很多很杂,参数的种类和个数也十分的多,理解起来需要花费不少的时间. 所以我在这里通过几个例子,对方法和每个参数都进行详细的解释,这 ...
- spring cache常用注解使用
1.@CacheConfig 主要用于配置该类中会用到的一些共用的缓存配置.示例: @CacheConfig(cacheNames = "users") public interf ...