EClipse開發NDK流程

EClipse開發NDK流程(如今studio也在2.2以後支持了很是簡單,只要建立項目的時候勾選c++支持就能夠了)
 
什麼狀況下使用ndk,1.保護代碼,java很容易反編譯,c/c++反彙編比較難,2.調用底層代碼,好比人臉識別3.便於移植,適合更多的嵌入式平臺再次使用
交叉編譯:是在一個平臺生成另外一個平臺可執行的代碼(平臺的指令集不同,好比電腦x86,手機arm,他們的系統執行使用不同的),
 
jni是什麼 java Native Interface 的縮寫,jni是標準成爲java平臺的一部分,它容許java和其餘語言混合開發進行交換
 
ndk 開發流程
1.下載ndk的工具,(好比r9d),下載完成後解壓,
2.配置ndk 的開發環境,
咱們先使用命令行執行ndk-build會獲得(命令執行完以後不是該命令不是內部或外部命令)
這時候開始配置開發環境配置完成以後在執行ndk-build會獲得(命令執行完以後不是該命令不是內部或外部命令),
緣由是系統環境變了,可是命令行還在剛纔配置前的環境,只要新開一個窗口在執行就ok了(通常會是could not find application.........)
這樣就完成了,could not 緣由是,這個命令須要在一個安卓項目下執行纔有效
3.配置eclipseADT插件  點擊Help-install New software... 點擊add,選擇location的Archive選擇ADT的路徑 , 
選擇完成後下邊有個列表,須要全選,最重要的是Android Native Development Tools 必定你要選
而後點擊next,選擇I  accept the......選項(我贊成的選項) 而後finish重啓eclipse就好了
到此爲止安裝完畢
4.接下來導入一些簡單的demo
在r9d下有個samples是一些簡單的ndk代碼
接下來import(最好copy一份到工做空間,不要動原來的項目)後
5.進入該項目的文件夾下,再執行ndk-build,執行完成後,刷新eclipse中的項目,
此刻會多了一個object的文件夾裏面包含了arm架構的.so包,以及其餘的包括x86架構的
6.
(運行到模擬器)最好安裝一個arm的兼容包(電腦是x86,手機是arm架構)
若是咱們不須要這麼多架構的包,能夠在jni的application.mk的文件中經過#註釋掉APP_ABI:=all
 
而後再經過命令執行ndk-build clean ,清除掉以前編譯生成的.so文件,刷新項目,
你會發現,object下的架構少了,此時你再刪除object文件夾,從新執行ndk-build,刷新eclipse項目,
而後就只剩一個arm架構的.so了
-------------------------------------------------------------------- 華    麗    的    分       割     線--------------------------------------------------------------------
開發本身的第一個ndk項目流程
第一步建立項目,
第二步項目下建立jni目錄
第三步編寫nativejava層代碼(這裏只有方法,沒有方法體,由於調用的是)
第四步經過javah命令生成jni頭文件(生成完畢後刷新項目,.h文件就出來了)
這裏要說明下.h文件的做用,這裏的做用是用來聲明跟本地語言交互平臺,
進行Java與C/C++交叉編譯的工具的平臺,這個文件不是必須的,可是行業規範是必需要寫的,應爲這樣容易查找,
第五步開發c
第六 步生成so庫
第七步加載so庫使用
 
1.建立項目(不解釋)
2.建立jni目錄
建立一個jni目錄(項目的根目錄下)
3.聲明本地方
在mainactivity類中,聲明一個方法
public static native String getStringFromC();
注意:這裏的必定要寫的兩個關鍵字是 native ,以及static,
其中native 毋庸置疑,就是聲明該方法是個調用本地的語言的方法,
static目的是加載該類的時候就直接加載該方法,其中若是不寫這個static
將會致使.h文件中沒有該方法的簽名(也就是.h文件沒有改方法的聲明的簽名平臺這個簽名是有規則的)
例如: JNIEXPORT void JNICALL Java_com_example_myjni_MainActivity_callMyC (JNIEnv *, jclass);不寫static將沒有這個
4.生成頭文件
而後生成頭文件,使用命令javah命令獲得一個幫助使用方式,
                                                //路徑        //輸出路徑  包名.類名
進入到項目的目錄,使用javah -classpath bin/classes -d jni  com.example.hellon.mainactivity   
這樣會報錯,    沒法訪問Android.app.Activity.......
緣由:它不知道activity在哪
解決方式:javah -classpath bin/classes; 任意sdk的android.jar路徑 -d jni  com.example.hellon.mainactivity   
而後回車,刷新eclipsejni文件夾多了一個.h結尾的文件,接下來就能夠在jni下建立c的文件開發c層(開發c層自行再找)
5.c層開發.....
建立你的.c文件,include 一些c須要使用的.h文件,以及你本身生成的.h文件
(這裏eclipse不支持智能提示,你能夠百度配置方法的支持自行配置,即使你配置好了對c的支持不太友好,c++則更好些)
語法問題自行找教程
6.生成so庫
準備成so庫
6.1(關於配置文件)
Android.mk文件,他是配置你那些文件須要生成so庫以及so庫名稱的,這個文件直接拷貝一份改改就好了,其中,LOCAL_MOUDLE :=你想生成.so文件的名字
LOCAL_SRC_FILES :=你要編譯的c文件.c
接下來編譯如同上邊,編譯完成後,刷新,多了.so文件就能夠引用了,
Application.mk文件主要是編譯那種平臺的.so文件,這個文件直接拷貝一份改改就好了 ,
其中 APP_ABI是配置平臺的,all表明全部,你也能夠指定平臺架構,這裏能夠去讀r9d中的doc文檔中,Application.mk一篇
(這裏咱們生成so庫後,.c文件沒法直接影響咱們的程序,
java調用so,而so是.c衍生出來的的,
當咱們肯定好so之後,c基本就喪失了做用,
這裏千萬不要由於沒有了刪除,由於你可能之後還要對c文件修改等  拓展,因此文件要留存)
6.2 (ndk -bulid   )
在項目目錄下使用該命令
生成so庫後,必定要確保libs下有一份(通常來說命令生成之後,會自動在項目下的lib中有一份,以及obj下local中也有一份)
7.
最後加載so庫
在mainactivity引用的時寫個靜態代碼塊static{ System.loadLibrary("你想要加載生成的so文件")}
 
結尾:
關於javah命令有沒有便捷方式問題,這個的確手寫很是累贅,咱們能夠配置eclipse的配置,詳情配置請自行搜索配置方案
還有就是
相關文章
相關標籤/搜索