鴻蒙手機(jī)版JNI實(shí)戰(zhàn)案例解析(JNI開發(fā)、SO庫生成、SO庫使用)
鴻蒙JNI開發(fā)現(xiàn)狀
現(xiàn)階段,不僅鴻蒙JNI相關(guān)的開發(fā)資料較少,而且Phone相關(guān)的JNI開發(fā)資料幾乎沒有,這對于新入行的鴻蒙開發(fā)者們來說,非常不友好。
也可能會(huì)給Android工程(使用了SO庫的工程)在遷移至鴻蒙系統(tǒng)時(shí)造成了阻礙。
案例演示
廢話不多說了,接下來,我們來演示鴻蒙手機(jī)版工程是如何做JNI開發(fā)的。
案例1:Native項(xiàng)目
如果開發(fā)者們只是想做簡單的Native開發(fā),并非為第三方提供SO庫,這就非常簡單了,詳細(xì)如下:
1、創(chuàng)建Native C++工程
目前,通過DevEco-Studio創(chuàng)建創(chuàng)建Native C++模板類型的工程時(shí),只有Car支持這種模板(Phone默認(rèn)不包含Native C++模板)。
不必?fù)?dān)心,我們就先創(chuàng)建Car類型的工程,然后選擇Native C++模板,如下圖:
然后,輸入工程名稱等信息,如下圖:
接下來,選擇C++標(biāo)準(zhǔn)庫,默認(rèn)就可以了,如下圖:
點(diǎn)擊【Finish】,工程就創(chuàng)建好了。
2、修改DeviceType配置
當(dāng)前工程默認(rèn)是Car類型的,想要支持手機(jī),我們只需要修改DeviceType即可。
首先,找到config.json文件,如下圖:
將“car”改為“phone”,即可支持運(yùn)行在手機(jī)設(shè)置上了(是不是超級簡單呢),如下圖:
3、測試
我這邊使用的是鴻蒙手機(jī)進(jìn)行測試的(鴻蒙手機(jī)是:由安卓P40升級的Harmony OS)。
另外,在真機(jī)上調(diào)試、運(yùn)行工程,需要申請證書(我這邊已申請,沒有的同學(xué),可以去華為官網(wǎng)申請)。
測試前,我們先看下默認(rèn)的模板工程結(jié)構(gòu):
整體的調(diào)用流程也很簡單:
開發(fā)者運(yùn)行工程 --> build工程 --> 執(zhí)行build.gradle
--> 執(zhí)行里面的externalNativeBuild --> 生成so庫文件 --> app啟動(dòng)
--> 頁面加載 --> 調(diào)用MainAbilitySlice類 --> 查找并加載so庫
--> 在onStart生命周期方法中調(diào)用native方法 --> 執(zhí)行so中的native實(shí)現(xiàn)方法
--> 返回結(jié)果 --> 綁定給text控件(最終將結(jié)果顯示在頁面上)
手機(jī)上的運(yùn)行結(jié)果(直接橫屏顯示......這是因?yàn)槲覀兊墓こ瘫旧硎荂ar類型的模板工程,UI樣式默認(rèn)設(shè)置的是橫屏的。如果不喜歡,開發(fā)者們也可以自行修改UI樣式):
so庫創(chuàng)建的默認(rèn)位置:
案例2:Native項(xiàng)目
如果開發(fā)者們不僅要做native開發(fā),還希望將so文件提供給第三方使用,這樣我們就需要以module的形式來開發(fā)了,同樣也不怎么復(fù)雜。
1、問題分析
現(xiàn)在有一個(gè)問題:創(chuàng)建module時(shí),連native c++模板都沒有了,如下圖:
這不是要讓廣大開發(fā)者們生氣、抓狂、準(zhǔn)備畫圈圈了么。
解決方案:
其實(shí),我們還有其他的方式(原因:JNI開發(fā)也就涉及到native方法定義、native源碼、Cmake配置文件、Gradle配置等內(nèi)容):我們可以新建一個(gè)Car類型的Native C++工程和一個(gè)Harmony os Library Module,然后將模板工程entry中的JNI代碼遷移到Harmony os Library Module中。
2、創(chuàng)建Car類型的Native C++模板工程
比較簡單,大家可以參考案例1的工程創(chuàng)建流程(此處就不再重復(fù)截圖了)
3、創(chuàng)建Harmony os Library Module
大家直接下一步就好(此處就不再截圖了)。
4、修改entry deviceType類型(改成phone)
5、拷貝文件
將entry下的.cxx目錄和cpp目錄拖拽到 libnative module中的相同位置:
將entry下的build.gradle中 native 編譯腳本拷貝至 libnative module中相同位置:
6、新建類定義native方法
為了加深大家理解,此處不再使用默認(rèn)的hello.cpp了,咱們實(shí)現(xiàn)一個(gè)簡單的JNI開發(fā):
新建TestNative類,定義native方法,如下圖:
通過DevEco-Studio的命令工具Terminal,進(jìn)入java目錄,創(chuàng)建頭文件:
執(zhí)行命令: 進(jìn)入module目錄: cd libnative/src/main/java/ 根據(jù)native方法生成頭文件:javah -jni xxxx(包名).類名
將頭文件拷貝到cpp目錄下,然后,右鍵cpp目錄,創(chuàng)建頭文件對應(yīng)的實(shí)現(xiàn)類:
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庫
此時(shí),我們libnative module庫的功能已經(jīng)實(shí)現(xiàn)了,可以生成so庫給其他工程使用了。
我們需要先讓libnative被entry依賴,這樣運(yùn)行app時(shí),才會(huì)自動(dòng)加載libnative,從而執(zhí)行其build.gradle中的native build配置,生成so庫。
entry依賴libnative,我們可以在entry的build.gradle中進(jìn)行配置:
運(yùn)行app后,查看libnative module下,生成了so庫:
9、生成的so庫,怎么提供給其他工程使用呢?
也很簡單,JNI主要包含了兩部分內(nèi)容:定義的native方法的Java類(Java代碼中調(diào)用so庫的入口)、native方法的實(shí)現(xiàn)類,我們只需要將這兩部分提供給他們就可以了:
1、定義的native方法的Java類:提供libnative的har包即可(給第三方時(shí),一般不提供源碼)
2、native方法的實(shí)現(xiàn)類:提供so庫文件即可
測試:
我們簡單點(diǎn),直接把so庫、har提供給我們工程的entry進(jìn)行測試即可,不再新建工程了(因?yàn)椋冶容^懶,哈哈):
首先,我們先取消entry build.gradle中依賴libnative的配置(防止重復(fù)依賴,因?yàn)椋篽ar已包含了libnative的Java代碼):
我們將libnative中的so庫、har拷貝到entry的libs目錄下:
在頁面中編寫調(diào)用har中native方法的代碼:
運(yùn)行app(運(yùn)行前最好clean下工程、同步下gradle,確保依賴的是改har,而非工程中的libnative module):
總結(jié)
鴻蒙進(jìn)行JNI開發(fā)其實(shí)不難,與安卓基本上一致,只是參考資料少一些而已。
如果大家對JNI不熟悉,可以參考我之前寫的JNI基礎(chǔ)的相關(guān)文章:
http://chabaoo.cn/article/169438.htm
http://chabaoo.cn/article/130786.htm
到此這篇關(guān)于鴻蒙手機(jī)版JNI實(shí)戰(zhàn)(JNI開發(fā)、SO庫生成、SO庫使用)的文章就介紹到這了,更多相關(guān)鴻蒙JNI開發(fā)實(shí)戰(zhàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android中l(wèi)istview嵌套scrollveiw沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Kotlin基礎(chǔ)通關(guān)之字符串與數(shù)字類型
這篇文章主要介紹了Kotlin基礎(chǔ)知識(shí)中的字符串與數(shù)字類型,編程中的入門知識(shí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android使用動(dòng)畫設(shè)置ProgressBar進(jìn)度的方法
這篇文章主要為大家詳細(xì)介紹了Android使用動(dòng)畫設(shè)置ProgressBar進(jìn)度的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Android6.0獲取動(dòng)態(tài)權(quán)限代碼示例
這篇文章主要介紹了Android6.0以上獲取動(dòng)態(tài)權(quán)限代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11詳解Android數(shù)據(jù)存儲(chǔ)—使用SQLite數(shù)據(jù)庫
本篇文章主要介紹了詳解Android數(shù)據(jù)存儲(chǔ)—使用SQLite數(shù)據(jù)庫,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03android開發(fā)仿ios的UIScrollView實(shí)例代碼
下面小編就為大家分享一篇android開發(fā)仿ios的UIScrollView實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01