Android Ndk基礎(chǔ)開發(fā)

引言

android開發(fā)人員使用的語(yǔ)言絕大多數(shù)是java, 至于koltin等其他語(yǔ)言暫時(shí)不做討論。故此如果需要使用底層或者第三方so庫(kù)就不得不使用ndk來(lái)調(diào)用。本文暫時(shí)只對(duì)舊的方式-->android.mk做討論,之后會(huì)增加一個(gè)cmake的方式。本人之前使用過第三方的c文件調(diào)用完成濾鏡功能,但是老話說(shuō)得好:溫故而知新?,F(xiàn)在再使用起來(lái)發(fā)現(xiàn)忘記了很多細(xì)節(jié)以及遇到了很多問題,查閱了資料以及自己的研究,下面先對(duì)使用android.mk的方式做一個(gè)總結(jié)。

何時(shí)使用NDK?

Google僅在極少數(shù)情況下建議使用NDK,有如下使用場(chǎng)景:

必須提高性能(例如,對(duì)大量數(shù)據(jù)進(jìn)行排序)。

使用第三方庫(kù)。舉例說(shuō)明:許多第三方庫(kù)由C/C++語(yǔ)言編寫,而Android應(yīng)用程序需要使用現(xiàn)有的第三方庫(kù),如Ffmpeg、OpenCV這樣的庫(kù)。

底層程序設(shè)計(jì)(例如,應(yīng)用程序不依賴Dalvik Java虛擬機(jī))。

至于什么是NDK 什么是JNI等一系列的理論性知識(shí)本文暫不做解釋,有興趣的童鞋可以查閱相關(guān)知識(shí)

如何使用

在項(xiàng)目底下建立一個(gè)jni文件夾,之后的c文件、頭文件、android.mk文件等都需要放在次文件夾底下。

模擬一個(gè)場(chǎng)景:項(xiàng)目需要使用一個(gè)打卡的設(shè)備,且廠家提供了一個(gè)c文件

c文件

我們可以看到第一行:JNIEXPORTvoidJNICALL ?Java_serialport_jujiang_com_ndktest_SerialPort_close。其中serialport_jujiang_com_ndktest_SerialPort的意思是serialport.jujiang.com.ndktest包底下有個(gè) SerialPort.java的類,這個(gè)類里面有個(gè)close方法與c文件中的close方法相關(guān)聯(lián)。所以我們此時(shí)要做的就是在相關(guān)包底下新建這個(gè)類

實(shí)際上要說(shuō)明的是這里的順序應(yīng)該是相反的。廠家提供的c文件中close方法是固定的 但是前面的包名以及類名肯定是與項(xiàng)目不一致的。所以我們需要先新建一個(gè)類名,里面有close方法。然后再把我們的c文件做相應(yīng)的修改。特別注意的是android studio有一個(gè)bug是需要建立一個(gè)空的c文件。所以此時(shí)需要在jni文件夾底下建立一個(gè)空的c文件。比如empty.c 里面的內(nèi)容可以是完全空白的。

1新建SerialPor類


SerialPort.java


2 rebuild Project

3找到相應(yīng)的class文件


然后在命令窗口定位到classes\debug目錄下,執(zhí)行命令(注意區(qū)分大小寫)

javah -jni serialport.jujiang.com.ndktest.SerialPort

生成對(duì)應(yīng)的頭文件SerialPort.h

這一步主要是為了生成頭文件供 c文件引用,實(shí)際上有的廠家或者第三方會(huì)提供頭文件,那么此時(shí)這一步可以省略。

生成的文件內(nèi)容如下:


我們可以看到和c文件類似,如果是廠家或者第三方提供的則同樣需要根據(jù)具體的包名做修改。

修改build.gradle配置


其中serial_port指明將要生成的so文件名

Android.mk文件


生成so文件

首先需要使用的命令是 ndk-build,將目標(biāo)定位到j(luò)ni的目錄底下

比如:E:\myProject\NdkTest\app>cd src/main/jni

然后執(zhí)行命令 ndk-build。之后就會(huì)在jnilib或者libs所在的文件夾底下生成對(duì)應(yīng)的so文件。

總結(jié)

以上就是基本的ndk使用?;镜募?xì)節(jié)都有涉及到.如遇到什么問題歡迎討論。之后會(huì)增加cmake的方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評(píng)論 25 709
  • Android游戲開發(fā)實(shí)踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實(shí)踐(1)之NDK與JNI...
    AlphaGL閱讀 3,910評(píng)論 0 24
  • 一、NDK產(chǎn)生的背景 Android平臺(tái)從誕生起,就已經(jīng)支持C、C++開發(fā)。眾所周知,Android的SDK基于J...
    Ten_Minutes閱讀 3,726評(píng)論 1 27
  • 本人為初學(xué)者,文章寫得不好,如有錯(cuò)誤,請(qǐng)大力懟我 或者看這里 如何使用jni進(jìn)行開發(fā) 本文主要針對(duì)Android環(huán)...
    AlbertHumbert閱讀 4,836評(píng)論 2 12
  • 前言:工具是次要的。前言:但是,我們不能放棄追逐好的工具。前言:而且,我們要勇于拋棄陳舊的工具。 一入前端海,就要...
    松鼠楊閱讀 1,439評(píng)論 0 1

友情鏈接更多精彩內(nèi)容