引言
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文件

我們可以看到第一行: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類

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配置

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的方式。