标签:logs 接口调用 text androi ioctl 解决 github share 开启
最近在了解公司历史的发展,发现了公司产品中几乎都要使用
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硬件访问服务(一)既然知道了Android系统中可以通过 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全称:Native Develop Kit,是Android的一个工具开发包NDK是属于Android的,与Java并无直接关系.
使用教程【NDK 入门指南】
通过Android Studio编译之后就可以生成 .so文件,之后就可以愉快的将 .so文件集成到项目中了。
我们首要目的就是要了解.so文件的作用是用来访问系统底层的硬件接口,而Android应用基本都是Java开发,而Java不支持直接访问硬件,但是Android提供了两种方式去访问硬件接口:JNI和硬件访问服务。JNI的方式编译后会产生.so文件。同时Android还给开发者提供了NDK这个开发工具包,开发者可以使用NDK快速实现 JNI的功能。
标签:logs 接口调用 text androi ioctl 解决 github share 开启
原文地址:https://www.cnblogs.com/gdragon/p/11746732.html