前言:學(xué)習(xí)一個(gè)新知識(shí)時(shí),無非就是弄懂三個(gè)問題:
1.這個(gè)是什么?
2.為什么要學(xué)習(xí)這個(gè)?
3.怎么做?
首先貼出官方介紹地址:https://developer.android.com/ndk/guides
NDK是什么?
NDK:即Native development kit(原聲開發(fā)工具)縮寫。其實(shí)從Android誕生之初,就已經(jīng)支持C/C++開發(fā),開發(fā)者可以通過jni完成自己的動(dòng)態(tài)庫(so)開發(fā),但是這樣存在一個(gè)問題:如何將so庫和我們的工程一起打包?而且這里面也存在著一些技術(shù)障礙,比如:很難調(diào)用framework層的api,兼容性難以保障等問題。所以,NDK就應(yīng)運(yùn)而生了。由此可知,他是一款開發(fā)工具集,可以幫助我們更快的開發(fā)so庫,以及和java工程一起打包等。
為什么要用NDK?
無非就是用NDK有什么好處?
1.可以快速的開發(fā)出so庫,以便共享
2.安全性高,java層的代碼很容易被反編譯,雖然做了混淆,但是懂得smali語法的人看起來還是很容易的,所以so庫還是很難被反編譯的。
3.提高執(zhí)行效率和性能,論起執(zhí)行效率,C/C++是要快于java的。
使用場(chǎng)景
由上面可以知道:
1.重復(fù)使用自己或者別人開發(fā)的c/c++庫
2.進(jìn)一步提升設(shè)備性能
怎么做?
首先貼出官方示例:https://github.com/googlesamples/android-ndk/tree/master
環(huán)境要求:
Android stadio 2.2及其更高版本
下載NDK工具包:
1.打開Android stadio的SDK Tools

NDK:這套工具允許您為 Android 使用 C 和 C++ 代碼。
CMake:一款外部構(gòu)建工具,可與 Gradle 搭配使用來構(gòu)建原生庫。如果您只計(jì)劃使用 ndk-build,則不需要此組件。
LLDB:一種調(diào)試程序,Android Studio 使用它來調(diào)試原生代碼。
將圖中所指的三個(gè)文件下載即可
手動(dòng)創(chuàng)建一個(gè)demo

因?yàn)槲疫@是Android stadio3.3的,所以界面呈現(xiàn)這樣子的,可能每個(gè)版本都不一樣,然后點(diǎn)擊Native C++,下面都是next,然后finish即可。
查看目錄時(shí)你會(huì)發(fā)現(xiàn)多了一個(gè)cpp目錄,該目錄下面有兩個(gè)文件,一個(gè)是CMarkLists.txt,一個(gè)是native-lib.cpp。
我們先來看看native-lib.cpp文件:

我們可以看到它里面其實(shí)就是用C寫的一些源代碼。
參數(shù)說明:
1、extern “C”:實(shí)現(xiàn) C 和 C++ 的混合編程,用于 C++ 代碼調(diào)用 C 的函數(shù)
2、JNIEXPORT 和 JNICALL,用于標(biāo)識(shí)函數(shù)用途的兩個(gè)宏
3、jstring,JNI 中的數(shù)據(jù)類型,對(duì)應(yīng) Java 中 String 類型,還有 8 種基本數(shù)據(jù)類型 jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean,引用數(shù)據(jù)類型 jintArray、jshortArray、jlongArray 等。
4、函數(shù)命名規(guī)則:Java類全路徑方法名,這里的類是那個(gè)調(diào)用 C 或 C++ 的類,像這里的 Java_com_timcoder_ndkproject_NativeHelper_buttonFromJNI
5、函數(shù)的參數(shù):JNIENV和jobject。這兩個(gè)參數(shù)暫時(shí)還未用到,也沒研究,等后面研究之后再來更新
我們?cè)賮砜纯碈MarkLists文件:

這張圖片沒有截全,它里面有三個(gè)方法:add_library, find_library, target_link_libraries, 而且官方注釋的也很清楚,我就不再重復(fù)了。
CMakeList.txt 是腳本文件, 需要指定包含哪些源代碼
大致了解了結(jié)構(gòu),那我們就先來做個(gè)很簡(jiǎn)單的小demo:
目標(biāo)實(shí)現(xiàn):點(diǎn)擊button,改變textview的內(nèi)容。

我自己創(chuàng)建了一個(gè)button-lib.cpp文件,你也可以使用官方的native-lib.cpp文件,在其里面添加一個(gè)相應(yīng)的方法就行。如果要自己創(chuàng)建源文件的話,還記得剛才上面所說的CMarklists文件的作用嘛?一定要在它里面配置源代碼的路徑才會(huì)生效。