最近在了解公司历史的发展,发现了公司产品中几乎都要使用 so 文件,不禁好奇这个 so 到底是何方神圣。

so 文件

soshared object 的缩写,见名思义就是共享的对象,机器可以直接运行的二进制代码。so 主要存在于 UnixLinux 系统中。【参考:安卓so文件是什么,又是如何开发出来的呢? 】
它是 c/c++ 实现的功能函数集合,并对外提供标准的接口,外层可以通过这个接口调用c/c++的代码。在 Android 系统上普遍用于调用系统的硬件接口。

那么,Android 系统为什么要使用.so文件呢?

Android 系统应用基本都是基于 Java 语言开发,而Java语言是不能直接访问Android系统底层的硬件接口。而Android系统中可以通过 JNI硬件访问服务去访问系统底层的硬件接口。比如:开启蓝牙、关闭蓝牙等

这里还有一个问题:为什么 Java不能直接访问Android系统底层的硬件呢?

  1. Java语言是跨平台的。【个人想法】:跨平台就会导致最后使用的平台是不确定的,因此要访问的底层硬件接口也是不确定的。
  2. 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 代码

特别注意:

  • JNIJava 调用 Native 语言的一种特性
  • JNI 是属于 Java 的,与 Android 无直接关系

【以上内容参考:Android JNI】

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 之间的关系说明白的更多相关文章

  1. JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C ...

  2. Android JNI&NDK编程小结及建议

    前言 由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签 ...

  3. JNI/NDK开发指南(二)——JVM查找java native方法的规则

    通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...

  4. JNI/NDK开发指南(开山篇)

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...

  5. JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程

    JNI/NDK Java调用C/C++前言  通过第三篇文章讲解在实际的开发过程中Java层调用C/C++层的处理流程.其实我们在很大的业务里也需要C/C+ +层去调用Java层,这两层之间的相互调用 ...

  6. JNI/NDK开发

    公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.J ...

  7. .NET Core与.NET Framework、Mono之间的关系

    随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...

  8. .NET Core 和 .NET Framework 之间的关系

    引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...

  9. 实体之间的关系【Entity Relationships】(EF基础系列篇9)

    Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...

随机推荐

  1. Micrometer 快速入门

    Micrometer为最流行的监控系统提供了一个简单的仪表客户端外观,允许仪表化JVM应用,而无需关心是哪个供应商提供的指标.它的作用和SLF4J类似,只不过它关注的不是Logging(日志),而是a ...

  2. Matplotlib散点图、条形图、直方图-02

    对比常用统计图 折线图: 特点:能够显示数据的变化趋势,反映事物的变化情况.(变化) 直方图: 特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计) 条形图: 特点:绘制离散的数据,能够一眼 ...

  3. Android 正 N 边形圆角头像的实现

    卖一下广告,欢迎大家关注我的微信公众号,扫一扫下方二维码或搜索微信号 stormjun94(徐公码字),即可关注. 目前专注于 Android 开发,主要分享 Android开发相关知识和一些相关的优 ...

  4. 使用file_get_contents() 发送GET、POST请求

    服务器端执行HTTP请求,大家经常使用的就是CURL,curl工具的确是很好的数据文件传输工具,那么除此之外还有其他的工具能实现这个功能吗? 现在为你介绍一个很常见的工具 file_get_conte ...

  5. java算法基础范例

    题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?  1.程序分析: 兔子的规律为数列1,1,2,3 ...

  6. 多智能体系统(MAS)简介

    1.背景   自然界中大量个体聚集时往往能够形成协调.有序,甚至令人感到震撼的运动场景,比如天空中集体翱翔的庞大的鸟群.海洋中成群游动的鱼群,陆地上合作捕猎的狼群.这些群体现象所表现出的分布.协调.自 ...

  7. 对cpu与load的理解及线上问题处理思路解读

    前言 2019双11还有不到2个月就要到来了,大家也都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高.因此趁着这个时机正好再好好学习.巩固一下cpu和load的概念,为双11做准 ...

  8. Git初始化项目 和 Gitignore

    初始化init: git init git status git add . git commit -am "init projrct" 添加远程仓库: git remote ad ...

  9. 十分钟快速学会Matplotlib基本图形操作

    在学习Python的各种工具包的时候,看网上的各种教程总是感觉各种方法很多很杂,参数的种类和个数也十分的多,理解起来需要花费不少的时间. 所以我在这里通过几个例子,对方法和每个参数都进行详细的解释,这 ...

  10. spring cache常用注解使用

    1.@CacheConfig 主要用于配置该类中会用到的一些共用的缓存配置.示例: @CacheConfig(cacheNames = "users") public interf ...