最近在瞭解公司歷史的發展,發現了公司產品中幾乎都要使用
so
文件,不由好奇這個so
究竟是何方神聖。html
so
是shared object
的縮寫,見名思義就是共享的對象,機器能夠直接運行的二進制代碼。so
主要存在於Unix
和Linux
系統中。【參考:安卓so文件是什麼,又是如何開發出來的呢? 】
它是c/c++
實現的功能函數集合,並對外提供標準的接口,外層能夠經過這個接口調用c/c++
的代碼。在Android
系統上廣泛用於調用系統的硬件接口。android
那麼,Android
系統爲何要使用.so
文件呢?c++
Android
系統應用基本都是基於Java
語言開發,而Java
語言是不能直接訪問Android
系統底層的硬件接口。而Android
系統中能夠經過JNI
和硬件訪問服務
去訪問系統底層的硬件接口。好比:開啓藍牙、關閉藍牙等git
這裏還有一個問題:爲何 Java
不能直接訪問Android
系統底層的硬件呢?github
Java
語言是跨平臺的。【我的想法】:跨平臺就會致使最後使用的平臺是不肯定的,所以要訪問的底層硬件接口也是不肯定的。Android
是基於 Linux
系統,而有些Linux
系統調用是不支持Java
的,好比ioctl
,只能C/C++
才能調用。【參考:Android硬件訪問服務(一)既然知道了Android
系統中能夠經過 JNI
和 硬件訪問服務
去訪問系統底層的硬件接口。
那麼先來了解一下什麼是JNI
吧ide
定義:
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
的功能。