so 文件
那么,Android
系统为什么要使用.so
文件呢?
这里还有一个问题:为什么 Java
不能直接访问Android
系统底层的硬件呢?
Java
语言是跨平台的。【个人想法】:跨平台就会导致最后使用的平台是不确定的,因此要访问的底层硬件接口也是不确定的。Android
是基于Linux
系统,而有些Linux
系统调用是不支持Java
的,比如ioctl
,只能C/C++
才能调用。【参考:Android硬件访问服务(一)
"使用JNI直接操作硬件"】
既然知道了Android
系统中可以通过 JNI
和 硬件访问服务
去访问系统底层的硬件接口。
那么先来了解一下什么是JNI
吧
JNI
特别注意:
JNI
是Java
调用Native
语言的一种特性JNI
是属于Java
的,与Android
无直接关系
JNI
代码经过编译之后在Unix/Linux
系统上就会生成 .so
文件,通过调用Java
代码调用.so
中的接口方法即可实现硬件的访问。
JNI
方式去访问硬件有一个弊端,就是只能一个应用调用一个硬件接口,而多个应用去调用该硬件接口就会出现冲突,那么硬件访问服务
的方式就是解决JNI
的弊端。
硬件访问服务
的定义如下:
更多硬件访问服务的资料
:
【Android硬件访问服务-Service】
【Android驱动(一)硬件访问服务学习之(二)Android通过硬件访问服务访问硬件】
在 Android
系统下 JNI
可以通过NDK
快速实现。那么NDK
又是什么呢?
NDK
使用教程【NDK 入门指南】
通过Android Studio
编译之后就可以生成 .so
文件,之后就可以愉快的将 .so
文件集成到项目中了。
总结
我们首要目的就是要了解.so
文件的作用是用来访问系统底层的硬件接口,而Android
应用基本都是Java
开发,而Java
不支持直接访问硬件,但是Android
提供了两种方式去访问硬件接口:JNI
和硬件访问服务
。JNI
的方式编译后会产生.so
文件。同时Android
还给开发者提供了NDK
这个开发工具包,开发者可以使用NDK
快速实现 JNI
的功能。