Android studio中NDK開發(二)——使用CMake引入第三方so庫及頭文件

一、前言
通常來說,第三方提供的so庫以及頭文件都沒有沒有引入jni.h頭文件。所以我們在導入第三方so庫以及頭文件的時候需要手動的將其關聯到官方的native-lib庫中,關聯成功後就可以在native-lib中include進第三方頭文件,引進頭文件成功後就可以在自定義的JNI接口中對第三方頭文件中內容進行調用。


二、準備
第三方so庫以及頭文件
創建一個默認的NDKDemo(可按照CMake構建NDKDemo這篇來構建)
沒有引入jni.h頭文件指的是native-lib.cpp中的 “#include<jni.h>”

å¨è¿éæå¥å¾çæè¿°

三、步驟
(一)新增文件夾,用來存放要導入的第三方so庫以及頭文件

第三方so庫:放在src/main/jniLibs/${ANDROID_ABI}(對應的CPU架構)/你的第三方so庫
第三方頭文件:放在src/main/cpp/include/你的第三方頭文件

å¨è¿éæå¥å¾çæè¿°

注意一下幾點:
1)jniLibs、CPU對應的架構文件夾(如上圖的armeabi-v7a)、include都是我自己創建的;


2)CPU對應的架構文件夾可以根據自己需要來聲明,因爲提供給我的第三方so庫只支持armeabi-v7a,所以這裏我只創建了armeabi-v7a文件夾,通常來說,如果第三方支持什麼CPU架構,就創建對應的架構文件夾(armeabi-v7a、arm64-v8a、x86、x84_64),然後把對應的so庫放到對應的架構文件夾中;

3)這裏的第三方so庫以及頭文件的存放位置只是我自己的習慣,並不是一定要按我這樣放,你可以定義自己的存放路徑,但是這個路徑你要記住,在後面配置 CMakeLists.txt 中會用到。
(二)配置CMakeLists.txt
修改CMakeLists.txt,關聯第三方頭文件到native-lib,配置好第三方so庫以及頭文件導入的路徑

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

注意:因爲涉及到公司的內部提供的so庫和頭文件,所以這裏我分別用紅字的“第三方庫名稱”和“第三方頭文件”來代替(到時候記得自行替換爲自己的so庫),望諒解~

(三)配置build.gradle(app)

å¨è¿éæå¥å¾çæè¿°

配置完以上步驟後,“build” 構建一下工程

(四)創建NDKUtil工具類(用來加載so庫以及聲明native方法)

å¨è¿éæå¥å¾çæè¿°

注意:getVersion()這個方法是我根據第三方頭文件中提供的接口定義的native方法,不是隨便起的

(五)修改native-lib.cpp
上面聲明好native方法後,接下來就是對native方法的實現,但不是自己實現,具體的實現已經打包在第三方so裏面了,所以我們只需要聲明JNI接口,在JNI接口中通過C/C++來調用第三方頭文件中的接口即可

å¨è¿éæå¥å¾çæè¿°

注意:這裏的對native方法的實現,並不是完全自己實現相應的功能,具體的實現已經打包在第三方so裏面了,我們只需要聲明JNI接口,在JNI接口中通過C/C++來調用第三方頭文件中的接口即可。

å¨è¿éæå¥å¾çæè¿°

(六)修改MainActivity
前面的步驟都沒有問題的話,接下來就只需要在MainActivity中調用自己聲明好的native方法即可

點擊“Run”一下,就可以在手機上看到效果了

å¨è¿éæå¥å¾çæè¿°


四、總結
關鍵點在於:將沒有實現JNI接口的第三方庫以及頭文件,通過在CMakeLists.txt中完成相關配置,從而關聯到已實現JNI接口的native-lib.cpp中,完成第三方so庫以及第三方頭文件的導入

調用鏈:
應用層聲明的native方法 —> native-lib.cpp中對應的JNI方法 —> 引入的第三方頭文件中的接口 —> 第三方so庫或者a庫中的具體實現方法

注意:這裏所說的關聯到已實現JNI接口的native-lib.cpp中,重點是要引入jni.h頭文件,不一定是native-lib.cpp文件,也可以在src/main/cpp下新建一個自定義的my-lib.cpp,然後把jni.h頭文件引入進來,即#include<“jni.h”>,其實核心就在於把jni.h關聯到第三方so庫中,而官方的native-lib.cpp或者自定義的my-lib.cpp是兩者連接的橋樑,這樣才能通過JNI層調用到第三方so庫的內容。


五、參考
https://blog.csdn.net/ma598214297/article/details/78387847#2.1 構建支持C%2FC%2B%2B的工程。


如有錯誤,歡迎指正,虛心學習!
————————————————
版權聲明:本文爲CSDN博主「Xiongjiayo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Xiongjiayo/article/details/85340121

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章