前言:學(xué)習(xí)一個新知識時掸鹅,無非就是弄懂三個問題:
1.這個是什么?
2.為什么要學(xué)習(xí)這個墅冷?
3.怎么做?
首先貼出官方介紹地址:https://developer.android.com/ndk/guides
NDK是什么?
NDK:即Native development kit(原聲開發(fā)工具)縮寫。其實從Android誕生之初含懊,就已經(jīng)支持C/C++開發(fā),開發(fā)者可以通過jni完成自己的動態(tài)庫(so)開發(fā)鳄袍,但是這樣存在一個問題:如何將so庫和我們的工程一起打包绢要?而且這里面也存在著一些技術(shù)障礙,比如:很難調(diào)用framework層的api拗小,兼容性難以保障等問題。所以樱哼,NDK就應(yīng)運而生了哀九。由此可知,他是一款開發(fā)工具集搅幅,可以幫助我們更快的開發(fā)so庫阅束,以及和java工程一起打包等。
為什么要用NDK茄唐?
無非就是用NDK有什么好處息裸?
1.可以快速的開發(fā)出so庫蝇更,以便共享
2.安全性高,java層的代碼很容易被反編譯呼盆,雖然做了混淆年扩,但是懂得smali語法的人看起來還是很容易的,所以so庫還是很難被反編譯的访圃。
3.提高執(zhí)行效率和性能厨幻,論起執(zhí)行效率,C/C++是要快于java的腿时。
使用場景
由上面可以知道:
1.重復(fù)使用自己或者別人開發(fā)的c/c++庫
2.進一步提升設(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)建原生庫格了。如果您只計劃使用 ndk-build,則不需要此組件徽鼎。
LLDB:一種調(diào)試程序盛末,Android Studio 使用它來調(diào)試原生代碼。
將圖中所指的三個文件下載即可
手動創(chuàng)建一個demo
因為我這是Android stadio3.3的纬傲,所以界面呈現(xiàn)這樣子的满败,可能每個版本都不一樣,然后點擊Native C++叹括,下面都是next算墨,然后finish即可。
查看目錄時你會發(fā)現(xiàn)多了一個cpp目錄汁雷,該目錄下面有兩個文件净嘀,一個是CMarkLists.txt,一個是native-lib.cpp。
我們先來看看native-lib.cpp文件:
我們可以看到它里面其實就是用C寫的一些源代碼侠讯。
參數(shù)說明:
1挖藏、extern “C”:實現(xiàn) C 和 C++ 的混合編程,用于 C++ 代碼調(diào)用 C 的函數(shù)
2厢漩、JNIEXPORT 和 JNICALL膜眠,用于標(biāo)識函數(shù)用途的兩個宏
3、jstring溜嗜,JNI 中的數(shù)據(jù)類型宵膨,對應(yīng) Java 中 String 類型,還有 8 種基本數(shù)據(jù)類型 jbyte炸宵、jchar辟躏、jshort、jint土全、jlong捎琐、jfloat会涎、jdouble、jboolean瑞凑,引用數(shù)據(jù)類型 jintArray末秃、jshortArray、jlongArray 等拨黔。
4蛔溃、函數(shù)命名規(guī)則:Java類全路徑方法名,這里的類是那個調(diào)用 C 或 C++ 的類篱蝇,像這里的 Java_com_timcoder_ndkproject_NativeHelper_buttonFromJNI
5贺待、函數(shù)的參數(shù):JNIENV和jobject。這兩個參數(shù)暫時還未用到零截,也沒研究麸塞,等后面研究之后再來更新
我們再來看看CMarkLists文件:
這張圖片沒有截全,它里面有三個方法:add_library涧衙, find_library哪工, target_link_libraries, 而且官方注釋的也很清楚弧哎,我就不再重復(fù)了雁比。
CMakeList.txt 是腳本文件, 需要指定包含哪些源代碼
大致了解了結(jié)構(gòu),那我們就先來做個很簡單的小demo:
目標(biāo)實現(xiàn):點擊button撤嫩,改變textview的內(nèi)容偎捎。
我自己創(chuàng)建了一個button-lib.cpp文件,你也可以使用官方的native-lib.cpp文件序攘,在其里面添加一個相應(yīng)的方法就行茴她。如果要自己創(chuàng)建源文件的話,還記得剛才上面所說的CMarklists文件的作用嘛程奠?一定要在它里面配置源代碼的路徑才會生效丈牢。