NDK:Native Development Kit原生開發工具
html
NDK能幹什麼:NDK使得在android中,java能夠調用C函數庫。java
爲何要用NDK:咱們都知道,java是半解釋型語言,很容易被反彙編後拿到源代碼文件,在開發一些重要協議時,咱們爲了安全起見,使用C語言來編寫這些重要的部分,來增大系統的安全性。還有,在一些接近硬件環境下,相信你們都清楚C與java的優劣。順帶提一下:NDK並不能顯著提高應用效率。why?咱們都以爲C語言比起java來講效率要高出不少,一方面,隨着jdk的不斷更新,java的效率也隨之提升;另外一方面,即使使用C語言編碼提升了應用效率,可是在java與C相互調用時平白又增大了開銷。linux
對於這些問題,這裏就很少說了,但願詳細瞭解的,請各位自行搜索。android
NDK開發,第一步,固然是搭建環境shell
首先,去 http://developer.android.com/tools/sdk/ndk/index.html 下載你對應平臺的開發工具數組
接着,咱們須要實現linux環境 下載cygwin http://www.cygwin.com/ (對於64位的用戶,能夠直接下載我已經下載好的,百度的連接應該比在線安裝快一些,正在上傳到個人網盤,稍後將地址放在回覆裏面)安全
選擇在線下載的朋友,建議選擇下圖的地址,(是國內的)函數
選擇好下載源之後就是選擇下載目錄了。咱們用鼠標點開組件列表中的「Devel」分支,在該分支下,有不少組件,
工具
咱們必須的是:binutils,gcc,gcc-mingw,gdb開發工具
選好這四個目錄了之後,就是漫長的等待了,能夠去吃頓飯差很少了。
下面該配環境變量了:NDK環境變量須要將NDK根目錄(其實就是ndk-builder.cmd文件的目錄)加入系統環境變量
cygwin環境變量須要將bin目錄加入系統環境變量
例如個人路徑是:C:\java\android-ndk-r7b 和 C:\java\cygwin\bin 這兩個
配置好環境後就能夠開始編碼了
一、新建一個android工程
二、在工程目錄下添加名爲 jni 的文件夾(必須)
三、在jni文件夾下新建你的.c文件(個人叫Hello.c)
四、在jni文件夾下新建名字爲Android.mk文件
.mk文件中加入
LOCAL_PATH := $(call my-dir) //當前路徑(若是你瞭解shell語言,應該能夠很輕鬆的理解) include $(CLEAR_VARS) LOCAL_MODULE := Hello //要生成的.so庫名 LOCAL_SRC_FILES := Hello.c //你的.c文件名字 include $(BUILD_SHARED_LIBRARY)
如今能夠開始寫咱們的C代碼了,固然這裏不能再去從main函數開始寫,而是有固定的命名方式
如圖,個人函數名爲:Java_com_example_testndk_MainActivity_helloWorldFromC (Java_包名_類名_函數名)
呵呵,寫C的朋友可能要抱怨了,我何時寫過這麼長的函數名了。沒辦法,這是jni的規範,以Java_開頭,後跟java應用的包名加上類名,都是如下劃線分割,最後纔是跟咱們的C函數名
至於參數形式以及返回值類型,咱們能夠去jdk目錄下翻閱jni.h文件(個人jni文件目錄:C:\java\jdk1.7.0_25\include\jni),有不少函數模板(不一樣於C++模板)
因爲源碼太多你們本身去查看吧,我就不貼圖了
在jni.h文件的第104行這裏能夠看到咱們返回的jstring本質上就是一個結構體指針,從C代碼裏面能夠看到就是一個指向字符串的指針,在java裏也就是一個數組。
好了,C代碼講解完畢,回到咱們android工程。
從剛纔的C代碼函數名,你們應該就能夠知道個人java類名了(這是必須的,由於要一一對應嘛)
須要注意的是圖中紅色方框中的靜態代碼塊
學過java你們都知道,一個 類在初始化的時候最早執行的不是構造方法而是靜態代碼塊,沒錯也就是這裏之因此把System.loadLibrary()放到靜態代碼塊的緣由。從名字咱們就能夠猜到了,加載庫(「Hello」)
還記得咱們在Android.mk中聲明的那個Hello嗎,就是那裏的名字
緊接着,看到第12行代碼,回憶java知識了,用native修飾的方法,表示java的本地方法,也就是咱們的C函數了。(其實這樣的函數在android SDK)中並很多見,好比咱們經常使用到的多媒體類MediaPlayer,你們能夠去看看源碼,這裏我就不發了,裏面有不少native方法,由於要調用音頻驅動嘛。
至此,NDK工程就結束了,來測試一下吧。首先編譯咱們的C代碼。打開cmd,切換到工程目錄下(工程目錄?右鍵工程名,properties,如上圖)輸入ndk-builder(當時的環境變量設置成功了嗎?去看看安卓工程的libs文件夾裏面是否是多出來了個libHello.so文件) 而後咱們再運行咱們的安卓工程吧。 最後,我再說一點本身的見解吧,首先就是C語言的基礎,結構體指針必定要掌握的好,好好看看jni.h文件給出了哪些函數,其中還有支持C與java交互的函數,要想用好NDK,先用好JNI