日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

發(fā)布時(shí)間:2024/10/12 windows 136 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鴻蒙JNI開(kāi)發(fā)現(xiàn)狀

現(xiàn)階段,不僅鴻蒙JNI相關(guān)的開(kāi)發(fā)資料較少,而且Phone相關(guān)的JNI開(kāi)發(fā)資料幾乎沒(méi)有,這對(duì)于新入行的鴻蒙開(kāi)發(fā)者們來(lái)說(shuō),非常不友好。

也可能會(huì)給Android工程(使用了SO庫(kù)的工程)在遷移至鴻蒙系統(tǒng)時(shí)造成了阻礙。

案例演示

廢話不多說(shuō)了,接下來(lái),我們來(lái)演示鴻蒙手機(jī)版工程是如何做JNI開(kāi)發(fā)的。

案例1:Native項(xiàng)目

如果開(kāi)發(fā)者們只是想做簡(jiǎn)單的Native開(kāi)發(fā),并非為第三方提供SO庫(kù),這就非常簡(jiǎn)單了,詳細(xì)如下:

1、創(chuàng)建Native C++工程

目前,通過(guò)DevEco-Studio創(chuàng)建創(chuàng)建Native C++模板類型的工程時(shí),只有Car支持這種模板(Phone默認(rèn)不包含Native C++模板)。

不必?fù)?dān)心,我們就先創(chuàng)建Car類型的工程,然后選擇Native C++模板,如下圖:

然后,輸入工程名稱等信息,如下圖:

接下來(lái),選擇C++標(biāo)準(zhǔn)庫(kù),默認(rèn)就可以了,如下圖:

點(diǎn)擊【Finish】,工程就創(chuàng)建好了。

2、修改DeviceType配置

當(dāng)前工程默認(rèn)是Car類型的,想要支持手機(jī),我們只需要修改DeviceType即可。

首先,找到config.json文件,如下圖:

將“car”改為“phone”,即可支持運(yùn)行在手機(jī)設(shè)置上了(是不是超級(jí)簡(jiǎn)單呢),如下圖:

3、測(cè)試

我這邊使用的是鴻蒙手機(jī)進(jìn)行測(cè)試的(鴻蒙手機(jī)是:由安卓P40升級(jí)的Harmony OS)。

另外,在真機(jī)上調(diào)試、運(yùn)行工程,需要申請(qǐng)證書(shū)(我這邊已申請(qǐng),沒(méi)有的同學(xué),可以去華為官網(wǎng)申請(qǐng))。

測(cè)試前,我們先看下默認(rèn)的模板工程結(jié)構(gòu):

整體的調(diào)用流程也很簡(jiǎn)單:

開(kāi)發(fā)者運(yùn)行工程 --> build工程 --> 執(zhí)行build.gradle

--> 執(zhí)行里面的externalNativeBuild --> 生成so庫(kù)文件 --> app啟動(dòng)

--> 頁(yè)面加載 --> 調(diào)用MainAbilitySlice類 --> 查找并加載so庫(kù)

--> 在onStart生命周期方法中調(diào)用native方法 --> 執(zhí)行so中的native實(shí)現(xiàn)方法

--> 返回結(jié)果 --> 綁定給text控件(最終將結(jié)果顯示在頁(yè)面上)

手機(jī)上的運(yùn)行結(jié)果(直接橫屏顯示......這是因?yàn)槲覀兊墓こ瘫旧硎荂ar類型的模板工程,UI樣式默認(rèn)設(shè)置的是橫屏的。如果不喜歡,開(kāi)發(fā)者們也可以自行修改UI樣式):

so庫(kù)創(chuàng)建的默認(rèn)位置:

案例2:Native項(xiàng)目

如果開(kāi)發(fā)者們不僅要做native開(kāi)發(fā),還希望將so文件提供給第三方使用,這樣我們就需要以module的形式來(lái)開(kāi)發(fā)了,同樣也不怎么復(fù)雜。

1、問(wèn)題分析

現(xiàn)在有一個(gè)問(wèn)題:創(chuàng)建module時(shí),連native c++模板都沒(méi)有了,如下圖:

這不是要讓廣大開(kāi)發(fā)者們生氣、抓狂、準(zhǔn)備畫(huà)圈圈了么。

解決方案:

其實(shí),我們還有其他的方式(原因:JNI開(kāi)發(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++模板工程

比較簡(jiǎn)單,大家可以參考案例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è)簡(jiǎn)單的JNI開(kāi)發(fā):

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

通過(guò)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)建頭文件對(duì)應(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庫(kù)

此時(shí),我們libnative module庫(kù)的功能已經(jīng)實(shí)現(xiàn)了,可以生成so庫(kù)給其他工程使用了。

我們需要先讓libnative被entry依賴,這樣運(yùn)行app時(shí),才會(huì)自動(dòng)加載libnative,從而執(zhí)行其build.gradle中的native build配置,生成so庫(kù)。

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

運(yùn)行app后,查看libnative module下,生成了so庫(kù):

9、生成的so庫(kù),怎么提供給其他工程使用呢?

也很簡(jiǎn)單,JNI主要包含了兩部分內(nèi)容:定義的native方法的Java類(Java代碼中調(diào)用so庫(kù)的入口)、native方法的實(shí)現(xiàn)類,我們只需要將這兩部分提供給他們就可以了:

1、定義的native方法的Java類:提供libnative的har包即可(給第三方時(shí),一般不提供源碼)

2、native方法的實(shí)現(xiàn)類:提供so庫(kù)文件即可

測(cè)試:

我們簡(jiǎn)單點(diǎn),直接把so庫(kù)、har提供給我們工程的entry進(jìn)行測(cè)試即可,不再新建工程了(因?yàn)?#xff0c;我比較懶,哈哈):

首先,我們先取消entry build.gradle中依賴libnative的配置(防止重復(fù)依賴,因?yàn)?#xff1a;har已包含了libnative的Java代碼):

我們將libnative中的so庫(kù)、har拷貝到entry的libs目錄下:

在頁(yè)面中編寫(xiě)調(diào)用har中native方法的代碼:

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

總結(jié)

如果有問(wèn)題,歡迎留言交流。

祝大家生活愉快、工作愉快,每天順心、開(kāi)心!!!

總結(jié)

以上是生活随笔為你收集整理的鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。