網(wǎng)上有很多關(guān)于JNI開(kāi)發(fā)的文章虚倒,可能你也留意到了有些文章講解JNI開(kāi)發(fā)流程的不太一樣惕它,我最開(kāi)始接觸的時(shí)候也是一臉懵逼曾棕;其實(shí)這些不一樣是Android Studio版本不一樣造成的油昂,在Android Studio2.2版本完善了對(duì)C/C++的支持敬肚,還提供CMAKE方式的編譯毕荐,支持lldb調(diào)試c/c++代碼了,這算是Android Studio對(duì)JNI開(kāi)發(fā)的一次重大革新吧艳馒。作為技術(shù)人員嘛憎亚,肯定要用最新的IDE才對(duì)吧,所以這次JNI的講解就只針對(duì)Android Studio2.2版本以后了弄慰,我也不會(huì)列舉與老版本開(kāi)發(fā)流程的對(duì)比第美,個(gè)人覺(jué)得沒(méi)有必要,如果確實(shí)需要了解曹动,請(qǐng)自行Google或者問(wèn)度娘吧斋日。接下來(lái)進(jìn)行正題了
一:環(huán)境搭建
先配置好NDK開(kāi)發(fā)的一些所需工具,在SDK Tools中勾選安裝CMake墓陈、LLDB恶守、NDK第献,如下圖:
NDK:讓你能在 Android 上面使用 C 和 C++ 代碼 的工具集。
CMake:外部構(gòu)建工具兔港。
LLDB:Android Studio上面調(diào)試本地代碼的工具庸毫。
注:如SDK Tools 不顯示LLDB,CMake 和NDK衫樊,說(shuō)明你配置了國(guó)內(nèi)鏡像站點(diǎn)飒赃。
二:開(kāi)始第一個(gè)Demo
1、File -> New -> New Project科侈,在如下界面中勾選Include C++ Support载佳,然后一路 Next,直到 Finish 為止即可
項(xiàng)目打開(kāi)后我們查看目錄結(jié)構(gòu)臀栈,與常規(guī)項(xiàng)目不同的是多了.externalNativeBuild文件夾蔫慧、cpp文件夾、CMakeLists.txt文件权薯,如下圖:
.externalNativeBuild文件夾:cmake編譯好的文件, 顯示支持的各種硬件等信息姑躲。系統(tǒng)生成。
cpp文件夾:存放C/C++代碼文件盟蚣,native-lib.cpp文件是該Demo中自帶的黍析,可更改。需要自己編寫屎开。
CMakeLists.txt文件:CMake腳本配置的文件阐枣。需要自己配置編寫。
同時(shí)奄抽,Gradle文件也有不同:
此處主要作用是Gradle調(diào)用外部構(gòu)建腳本 CMakeLists.txt侮繁。打開(kāi)CMakeLists.txt文件,主要關(guān)心的有兩部分:
兩個(gè)library的名字(需一致)以及一個(gè)cpp文件的路徑如孝,彼此需要對(duì)應(yīng)一致;add_library方法和target_link_libraries方法一一對(duì)應(yīng)娩贷,當(dāng)有多個(gè)庫(kù)第晰,多個(gè)C/C++文件時(shí),可寫多組add_library方法和target_link_libraries方法彬祖。
本來(lái)新建項(xiàng)目后就自帶了一個(gè)Demo茁瘦,但我把JNI的代碼單獨(dú)放在了一個(gè)類里面,此處做了簡(jiǎn)單修改储笑,如下:
NdkTest:
native-lib文件:
此處方法的命名規(guī)則為 Java_命名空間(其中.換為_(kāi))_類名_方法名甜熔;其中解釋一下
JNIEnv *:表示一個(gè)指向JNI環(huán)境的指針, 可以通過(guò)它來(lái)訪問(wèn)JNI提供的接口方法.
jobject:表示java對(duì)象中的this.
JNIEXPORT和JNICALL:它們是JNI種所定義的宏, 可以在jni.h這個(gè)頭文件中查到
另外說(shuō)明一下,如果要在native-lib.cpp文件中添加多少方法突倍,必須添加在 extern “c” { } 中腔稀,或者在每個(gè)方法前加 extern “c” , 否則會(huì)報(bào)找不到方法!
ManActivity調(diào)用:
運(yùn)行代碼盆昙,就能看到效果,調(diào)用了C++方法在界面上顯示了Hello from C++字符串和10焊虏, 簡(jiǎn)單的JNIDemo就完成了淡喜。