天天看點

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

現階段,不僅鴻蒙JNI相關的開發資料較少,而且Phone相關的JNI開發資料幾乎沒有,這對于新入行的鴻蒙開發者們來說,非常不友好。

也可能會給Android工程(使用了SO庫的工程)在遷移至鴻蒙系統時造成了阻礙。

廢話不多說了,接下來,我們來示範鴻蒙手機版工程是如何做JNI開發的。

如果開發者們隻是想做簡單的Native開發,并非為第三方提供SO庫,這就非常簡單了,詳細如下:

1、建立Native C++工程

目前,通過DevEco-Studio建立建立Native C++模闆類型的工程時,隻有Car支援這種模闆(Phone預設不包含Native C++模闆)。

不必擔心,我們就先建立Car類型的工程,然後選擇Native C++模闆,如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

然後,輸入工程名稱等資訊,如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

接下來,選擇C++标準庫,預設就可以了,如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

點選【Finish】,工程就建立好了。

2、修改DeviceType配置

目前工程預設是Car類型的,想要支援手機,我們隻需要修改DeviceType即可。

首先,找到config.json檔案,如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

将“car”改為“phone”,即可支援運作在手機設定上了(是不是超級簡單呢),如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

3、測試

我這邊使用的是鴻蒙手機進行測試的(鴻蒙手機是:由安卓P40更新的Harmony OS)。

另外,在真機上調試、運作工程,需要申請證書(我這邊已申請,沒有的同學,可以去華為官網申請)。

測試前,我們先看下預設的模闆工程結構:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)
鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

整體的調用流程也很簡單:

手機上的運作結果(直接橫屏顯示......這是因為我們的工程本身是Car類型的模闆工程,UI樣式預設設定的是橫屏的。如果不喜歡,開發者們也可以自行修改UI樣式):

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

so庫建立的預設位置:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

如果開發者們不僅要做native開發,還希望将so檔案提供給第三方使用,這樣我們就需要以module的形式來開發了,同樣也不怎麼複雜。

1、問題分析

現在有一個問題:建立module時,連native c++模闆都沒有了,如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

這不是要讓廣大開發者們生氣、抓狂、準備畫圈圈了麼。

解決方案:

其實,我們還有其他的方式(原因:JNI開發也就涉及到native方法定義、native源碼、Cmake配置檔案、Gradle配置等内容):我們可以建立一個Car類型的Native C++工程和一個Harmony os Library Module,然後将模闆工程entry中的JNI代碼遷移到Harmony os Library Module中。

2、建立Car類型的Native C++模闆工程

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

比較簡單,大家可以參考案例1的工程建立流程(此處就不再重複截圖了)

3、建立Harmony os Library Module

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

大家直接下一步就好(此處就不再截圖了)。

4、修改entry deviceType類型(改成phone)

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

5、拷貝檔案

将entry下的.cxx目錄和cpp目錄拖拽到 libnative module中的相同位置:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

将entry下的build.gradle中 native 編譯腳本拷貝至 libnative module中相同位置:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

6、建立類定義native方法

為了加深大家了解,此處不再使用預設的hello.cpp了,咱們實作一個簡單的JNI開發:

建立TestNative類,定義native方法,如下圖:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

通過DevEco-Studio的指令工具Terminal,進入java目錄,建立頭檔案:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

将頭檔案拷貝到cpp目錄下,然後,右鍵cpp目錄,建立頭檔案對應的實作類:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)
鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

7、修改CmakeList.txt

8、生成so庫

此時,我們libnative module庫的功能已經實作了,可以生成so庫給其他工程使用了。

我們需要先讓libnative被entry依賴,這樣運作app時,才會自動加載libnative,進而執行其build.gradle中的native build配置,生成so庫。

entry依賴libnative,我們可以在entry的build.gradle中進行配置:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

運作app後,檢視libnative module下,生成了so庫:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

9、生成的so庫,怎麼提供給其他工程使用呢?

也很簡單,JNI主要包含了兩部分内容:定義的native方法的Java類(Java代碼中調用so庫的入口)、native方法的實作類,我們隻需要将這兩部分提供給他們就可以了:

測試:

我們簡單點,直接把so庫、har提供給我們工程的entry進行測試即可,不再建立工程了(因為,我比較懶,哈哈):

首先,我們先取消entry build.gradle中依賴libnative的配置(防止重複依賴,因為:har已包含了libnative的Java代碼):

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

我們将libnative中的so庫、har拷貝到entry的libs目錄下:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)
鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

在頁面中編寫調用har中native方法的代碼:

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

運作app(運作前最好clean下工程、同步下gradle,確定依賴的是改har,而非工程中的libnative module):

鴻蒙手機版JNI實戰(JNI開發、SO庫生成、SO庫使用)

鴻蒙進行JNI開發其實不難,與安卓基本上一緻,隻是參考資料少一些而已。

如果大家對JNI不熟悉,可以參考我之前寫的JNI基礎的相關文章:

https://www.cnblogs.com/qixingchao/p/11911764.html

https://www.cnblogs.com/qixingchao/p/11911787.html

視訊講解:

https://edu.csdn.net/course/detail/27043

https://edu.csdn.net/course/detail/27092

如果有問題,歡迎留言交流。

祝大家生活愉快、工作愉快,每天順心、開心!!!

繼續閱讀