將 so|JNI|NDK 之間的關係說明白

最近在瞭解公司歷史的發展,發現了公司產品中幾乎都要使用 so 文件,不由好奇這個 so 究竟是何方神聖。html

so 文件

soshared object 的縮寫,見名思義就是共享的對象,機器能夠直接運行的二進制代碼。so 主要存在於 UnixLinux 系統中。【參考:安卓so文件是什麼,又是如何開發出來的呢? 】
它是 c/c++ 實現的功能函數集合,並對外提供標準的接口,外層能夠經過這個接口調用c/c++的代碼。在 Android 系統上廣泛用於調用系統的硬件接口。android

那麼,Android 系統爲何要使用.so文件呢?c++

Android 系統應用基本都是基於 Java 語言開發,而Java語言是不能直接訪問Android系統底層的硬件接口。而Android系統中能夠經過 JNI硬件訪問服務去訪問系統底層的硬件接口。好比:開啓藍牙、關閉藍牙等git

這裏還有一個問題:爲何 Java不能直接訪問Android系統底層的硬件呢?github

  1. Java語言是跨平臺的。【我的想法】:跨平臺就會致使最後使用的平臺是不肯定的,所以要訪問的底層硬件接口也是不肯定的。
  2. Android 是基於 Linux 系統,而有些Linux系統調用是不支持Java的,好比ioctl,只能C/C++才能調用。【參考:Android硬件訪問服務(一)
    "使用JNI直接操做硬件"】

既然知道了Android系統中能夠經過 JNI硬件訪問服務去訪問系統底層的硬件接口。
那麼先來了解一下什麼是JNIide

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的功能。

相關文章
相關標籤/搜索