鴻蒙手機版JNI實戰案例解析(JNI開發、SO庫生成、SO庫使用)
鴻蒙JNI開發現狀
現階段,不僅鴻蒙JNI相關的開發資料較少,而且Phone相關的JNI開發資料幾乎沒有,這對於新入行的鴻蒙開發者們來說,非常不友好。
也可能會給Android工程(使用瞭SO庫的工程)在遷移至鴻蒙系統時造成瞭阻礙。
案例演示
廢話不多說瞭,接下來,我們來演示鴻蒙手機版工程是如何做JNI開發的。
案例1:Native項目
如果開發者們隻是想做簡單的Native開發,並非為第三方提供SO庫,這就非常簡單瞭,詳細如下:
1、創建Native C++工程
目前,通過DevEco-Studio創建創建Native C++模板類型的工程時,隻有Car支持這種模板(Phone默認不包含Native C++模板)。
不必擔心,我們就先創建Car類型的工程,然後選擇Native C++模板,如下圖:
然後,輸入工程名稱等信息,如下圖:
接下來,選擇C++標準庫,默認就可以瞭,如下圖:
點擊【Finish】,工程就創建好瞭。
2、修改DeviceType配置
當前工程默認是Car類型的,想要支持手機,我們隻需要修改DeviceType即可。
首先,找到config.json文件,如下圖:
將“car”改為“phone”,即可支持運行在手機設置上瞭(是不是超級簡單呢),如下圖:
3、測試
我這邊使用的是鴻蒙手機進行測試的(鴻蒙手機是:由安卓P40升級的Harmony OS)。
另外,在真機上調試、運行工程,需要申請證書(我這邊已申請,沒有的同學,可以去華為官網申請)。
測試前,我們先看下默認的模板工程結構:
整體的調用流程也很簡單:
開發者運行工程 –> build工程 –> 執行build.gradle
–> 執行裡面的externalNativeBuild –> 生成so庫文件 –> app啟動
–> 頁面加載 –> 調用MainAbilitySlice類 –> 查找並加載so庫
–> 在onStart生命周期方法中調用native方法 –> 執行so中的native實現方法
–> 返回結果 –> 綁定給text控件(最終將結果顯示在頁面上)
手機上的運行結果(直接橫屏顯示……這是因為我們的工程本身是Car類型的模板工程,UI樣式默認設置的是橫屏的。如果不喜歡,開發者們也可以自行修改UI樣式):
so庫創建的默認位置:
案例2:Native項目
如果開發者們不僅要做native開發,還希望將so文件提供給第三方使用,這樣我們就需要以module的形式來開發瞭,同樣也不怎麼復雜。
1、問題分析
現在有一個問題:創建module時,連native c++模板都沒有瞭,如下圖:
這不是要讓廣大開發者們生氣、抓狂、準備畫圈圈瞭麼。
解決方案:
其實,我們還有其他的方式(原因:JNI開發也就涉及到native方法定義、native源碼、Cmake配置文件、Gradle配置等內容):我們可以新建一個Car類型的Native C++工程和一個Harmony os Library Module,然後將模板工程entry中的JNI代碼遷移到Harmony os Library Module中。
2、創建Car類型的Native C++模板工程
比較簡單,大傢可以參考案例1的工程創建流程(此處就不再重復截圖瞭)
3、創建Harmony os Library Module
大傢直接下一步就好(此處就不再截圖瞭)。
4、修改entry deviceType類型(改成phone)
5、拷貝文件
將entry下的.cxx目錄和cpp目錄拖拽到 libnative module中的相同位置:
將entry下的build.gradle中 native 編譯腳本拷貝至 libnative module中相同位置:
6、新建類定義native方法
為瞭加深大傢理解,此處不再使用默認的hello.cpp瞭,咱們實現一個簡單的JNI開發:
新建TestNative類,定義native方法,如下圖:
通過DevEco-Studio的命令工具Terminal,進入java目錄,創建頭文件:
執行命令: 進入module目錄: cd libnative/src/main/java/ 根據native方法生成頭文件:javah -jni xxxx(包名).類名
將頭文件拷貝到cpp目錄下,然後,右鍵cpp目錄,創建頭文件對應的實現類:
7、修改CmakeList.txt
# the minimum version of CMake. cmake_minimum_required(VERSION 3.4.1) project(TestNative) add_library(native SHARED testnative.cpp) target_link_libraries(native)
8、生成so庫
此時,我們libnative module庫的功能已經實現瞭,可以生成so庫給其他工程使用瞭。
我們需要先讓libnative被entry依賴,這樣運行app時,才會自動加載libnative,從而執行其build.gradle中的native build配置,生成so庫。
entry依賴libnative,我們可以在entry的build.gradle中進行配置:
運行app後,查看libnative module下,生成瞭so庫:
9、生成的so庫,怎麼提供給其他工程使用呢?
也很簡單,JNI主要包含瞭兩部分內容:定義的native方法的Java類(Java代碼中調用so庫的入口)、native方法的實現類,我們隻需要將這兩部分提供給他們就可以瞭:
1、定義的native方法的Java類:提供libnative的har包即可(給第三方時,一般不提供源碼)
2、native方法的實現類:提供so庫文件即可
測試:
我們簡單點,直接把so庫、har提供給我們工程的entry進行測試即可,不再新建工程瞭(因為,我比較懶,哈哈):
首先,我們先取消entry build.gradle中依賴libnative的配置(防止重復依賴,因為:har已包含瞭libnative的Java代碼):
我們將libnative中的so庫、har拷貝到entry的libs目錄下:
在頁面中編寫調用har中native方法的代碼:
運行app(運行前最好clean下工程、同步下gradle,確保依賴的是改har,而非工程中的libnative module):
總結
鴻蒙進行JNI開發其實不難,與安卓基本上一致,隻是參考資料少一些而已。
如果大傢對JNI不熟悉,可以參考我之前寫的JNI基礎的相關文章:
https://www.jb51.net/article/169438.htm
https://www.jb51.net/article/130786.htm
到此這篇關於鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)的文章就介紹到這瞭,更多相關鴻蒙JNI開發實戰內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- AndroidStudio集成OpenCV的實現教程
- android 調用JNI SO動態庫的方法
- 華為鴻蒙系統應用開發工具 DevEco Studio的安裝和使用圖文教程
- 非常詳細的android so庫逆向調試教程
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/下載超時的問題