溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JNI開發(fā)示例

發(fā)布時間:2021-04-28 09:35:51 來源:億速云 閱讀:149 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下JNI開發(fā)示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

案例1:Native項目

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

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

目前,通過DevEco-Studio創(chuàng)建創(chuàng)建Native C++模板類型的工程時,只有Car支持這種模板(Phone默認不包含Native C++模板)。
不必擔(dān)心,我們就先創(chuàng)建Car類型的工程,然后選擇Native C++模板,如下圖:

JNI開發(fā)示例

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

JNI開發(fā)示例

接下來,選擇C++標準庫,默認就可以了,如下圖:

JNI開發(fā)示例

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

2、修改DeviceType配置

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

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

JNI開發(fā)示例

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

JNI開發(fā)示例

3、測試

我這邊使用的是鴻蒙手機進行測試的(鴻蒙手機是:由安卓P40升級的Harmony OS)。
另外,在真機上調(diào)試、運行工程,需要申請證書(我這邊已申請,沒有的同學(xué),可以去華為官網(wǎng)申請)。

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

JNI開發(fā)示例

JNI開發(fā)示例

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

開發(fā)者運行工程 --> build工程 --> 執(zhí)行build.gradle
--> 執(zhí)行里面的externalNativeBuild --> 生成so庫文件 --> app啟動
--> 頁面加載 --> 調(diào)用MainAbilitySlice類 --> 查找并加載so庫
--> 在onStart生命周期方法中調(diào)用native方法 --> 執(zhí)行so中的native實現(xiàn)方法
--> 返回結(jié)果 --> 綁定給text控件(最終將結(jié)果顯示在頁面上)

手機上的運行結(jié)果(直接橫屏顯示......這是因為我們的工程本身是Car類型的模板工程,UI樣式默認設(shè)置的是橫屏的。如果不喜歡,開發(fā)者們也可以自行修改UI樣式):

JNI開發(fā)示例

so庫創(chuàng)建的默認位置:

JNI開發(fā)示例

案例2:Native項目

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

1、問題分析

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

JNI開發(fā)示例

這不是要讓廣大開發(fā)者們生氣、抓狂、準備畫圈圈了么。

解決方案:

其實,我們還有其他的方式(原因:JNI開發(fā)也就涉及到native方法定義、native源碼、Cmake配置文件、Gradle配置等內(nèi)容):我們可以新建一個Car類型的Native C++工程和一個Harmony os Library Module,然后將模板工程entry中的JNI代碼遷移到Harmony os Library Module中。

2、創(chuàng)建Car類型的Native C++模板工程

JNI開發(fā)示例

比較簡單,大家可以參考案例1的工程創(chuàng)建流程(此處就不再重復(fù)截圖了)

3、創(chuàng)建Harmony os Library Module

JNI開發(fā)示例

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

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

JNI開發(fā)示例

5、拷貝文件

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

JNI開發(fā)示例

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

JNI開發(fā)示例

6、新建類定義native方法

為了加深大家理解,此處不再使用默認的hello.cpp了,咱們實現(xiàn)一個簡單的JNI開發(fā):
新建TestNative類,定義native方法,如下圖:

JNI開發(fā)示例

通過DevEco-Studio的命令工具Terminal,進入java目錄,創(chuàng)建頭文件:

執(zhí)行命令:
進入module目錄: cd libnative/src/main/java/
根據(jù)native方法生成頭文件:javah -jni xxxx(包名).類名

JNI開發(fā)示例

將頭文件拷貝到cpp目錄下,然后,右鍵cpp目錄,創(chuàng)建頭文件對應(yīng)的實現(xiàn)類:

JNI開發(fā)示例

JNI開發(fā)示例

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庫的功能已經(jīng)實現(xiàn)了,可以生成so庫給其他工程使用了。

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

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

JNI開發(fā)示例

運行app后,查看libnative module下,生成了so庫:

JNI開發(fā)示例

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

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

1、定義的native方法的Java類:提供libnative的har包即可(給第三方時,一般不提供源碼)
2、native方法的實現(xiàn)類:提供so庫文件即可

測試:
我們簡單點,直接把so庫、har提供給我們工程的entry進行測試即可,不再新建工程了(因為,我比較懶,哈哈):
首先,我們先取消entry build.gradle中依賴libnative的配置(防止重復(fù)依賴,因為:har已包含了libnative的Java代碼):

JNI開發(fā)示例

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

JNI開發(fā)示例

JNI開發(fā)示例

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

JNI開發(fā)示例

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

JNI開發(fā)示例

以上是“JNI開發(fā)示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

jni
AI