前言:
由于Monica 小MM 一篇 史上最全Android開發(fā)環(huán)境搭建 一下子就包含了jdk,,android sdk ,, ADT 等都包含了下去了,無奈只能選了個(gè)NDK來寫寫,。
一,、NDK 是什么?
NDK:全稱Native Development Kit,。是android平臺(tái)的一部分,。
提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C )的動(dòng)態(tài)庫,,并能自動(dòng)將so和java應(yīng)用一起打包成apk,。比較簡(jiǎn)單的說,NDK是一套交叉編譯工具,它可以幫你把你用C或C 書寫的代碼,,編譯為.so(類似與win下的.dll)格式的文件,,使你可以在你的Android程序當(dāng)中用Java語言(JNI)調(diào)用這些代碼。
二,、為何要用到NDK,?
代碼的保護(hù),由于apk的java層代碼很容易被反編譯,,而C/C 庫反匯難度較大,。
在NDK中調(diào)用第三方C/C 庫,因?yàn)榇蟛糠值拈_源庫都是用C/C 代碼編寫的,。
便于移植,,用C/C 寫得庫可以方便在其他的嵌入式平臺(tái)上再次使用。
考慮到代碼運(yùn)行效率,,用C/C 寫的代碼頁比JAVA運(yùn)行效率高的多,。
三、如何使用NDK,?
在知道如何使用NDK開發(fā)前,,我們有一步還沒有完成,NDK環(huán)境的搭建,。
現(xiàn)在Google上隨便一搜 ,,好多人把NDK的發(fā)布與Android是否可以使用C 開發(fā)混為一談。
在Android SDK首次發(fā)布時(shí),,Google就宣稱其虛擬機(jī)Dalvik支持JNI編程方式,,也就是第三方應(yīng)用完全可以通過JNI調(diào)用自己的C動(dòng)態(tài)庫,即在Android平臺(tái)上,,“Java C”的編程方式是一直都可以實(shí)現(xiàn)的,。
當(dāng)然在NDK出現(xiàn)之前,JNI的開發(fā)一直是“灰色模式”,。
在這鄭重提醒各位,,NDK的出現(xiàn)并不意味著完全可以使用C/C 去開發(fā)APP。NDK文檔明確說明:it is not a good way,。因?yàn)镹DK并沒有提供各種系統(tǒng)事件處理支持,,也沒有提供應(yīng)用程序生命周期維護(hù)。至少到目前為止,,還沒有看到一款是純Native開發(fā)的軟件,。(可能我無知了)。
廢話不多說了,,直接進(jìn)入正題 -- 如何搭建NDK環(huán)境。
1、Android 開發(fā)環(huán)境搭建
Android開發(fā)環(huán)境搭建不是重點(diǎn),相信看此文章的很多人都已經(jīng)搭建成功,這里隨便概述性的說說,。
1) 下載 JDK
2) 下載 Eclipse
3) 下載 Android SDK
4) 啟動(dòng)Eclipse , 安裝 ADT
2,、下載安裝Android NDK
我們可以去官方網(wǎng)站直接下載,現(xiàn)在版本已經(jīng)到了r8 ,。Download the NDK,。
由于NDK編譯代碼時(shí)必須要用到make和gcc,所以你必須先搭建一個(gè)linux環(huán)境,。
首先先說在_Linux_環(huán)境下我們是如何搭建NDK環(huán)境的,。
我們直接到 Download the NDK 去下載NDK,接著我們就配置下環(huán)境變量即可,。如:
sudo vim /etc/environment
進(jìn)入的就是環(huán)境變量配置,,
在environment的PATH環(huán)境變量中添加你的android-ndk的安裝路勁,然后再讓這個(gè)更改的環(huán)境變量立即生效:
source /etc/environment
經(jīng)過了上述步驟,,在命令行下敲:
ndk-bulid
彈出如下的錯(cuò)誤,,而不是說ndk-build not found,就說明ndk環(huán)境已經(jīng)安裝成功了,。
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting . Stop.
以上是linux環(huán)境下如何搭建的(比較簡(jiǎn)單),。
接下來是_Windows_下如何搭建ndk環(huán)境的。
首先我們必須在windows環(huán)境下模擬出一個(gè)unix環(huán)境,,而Cygwin是一個(gè)在windows平臺(tái)上運(yùn)行的unix模擬環(huán)境,它對(duì)于學(xué)習(xí)unix/linux操作環(huán)境,,或者從unix到windows的應(yīng)用程序移植,非常有用,。通過它,,你就可以在不安裝linux的情況下使用NDK來編譯C、C 代碼了,。下面我們一步一步的安裝cygwin吧,。
首先,你得先跑到http://www.cygwin.comsetup.exe下載
1,、 然后雙擊運(yùn)行吧,,運(yùn)行后你將看到安裝向?qū)Ы缑妫?/p>
2、 點(diǎn)擊下一步
1 2 3 4 5 6 |
此時(shí)讓你選擇安裝方式: 1)Install from Internet:直接從Internet上下載并立即安裝(安裝完成后,,下載好的安裝文件并不會(huì)被刪除,,而是仍然被保留,以便下次再安裝),。 2)Download Without Installing:只是將安裝文件下載到本地,,但暫時(shí)不安裝。 3)Install from Local Directory:不下載安裝文件,,直接從本地某個(gè)含有安裝文件的目錄進(jìn)行安裝,。 |
3,、選擇第一項(xiàng),然后點(diǎn)擊下一步:
4,、選擇要安裝的目錄,,注意,最好不要放到有中文和空格的目錄里,,似乎會(huì)造成安裝出問題,,其它選項(xiàng)不用變,之后點(diǎn)下一步:
5,、上一步是選擇安裝cygwin的目錄,,這個(gè)是選擇你下載的安裝包所在的目錄,默認(rèn)是你運(yùn)行setup.exe的目 錄,,直接點(diǎn)下一步就可以:
6,、此時(shí)你共有三種連接方式選擇:
1 2 3 4 5 6 7 |
1) Direct Connection:直接連接。 2) Use IE5 Settings:使用IE的連接參數(shù)設(shè)置進(jìn)行連接,。 3) Use HTTP/FTP Proxy:使用HTTP或FTP代理服務(wù)器進(jìn)行連接(需要輸入服務(wù)器地址,、端口號(hào))。 用戶可根據(jù)自己的網(wǎng)絡(luò)連接的實(shí)情情況進(jìn)行選擇,,一般正常情況下,,均選擇第一種,也就是直接連接方式,。然后再點(diǎn)擊“下一步”,, |
7、 這是選擇要下載的站點(diǎn),,我用的是http://mirrors.,,速度感覺還挺快,選擇后點(diǎn)下一步
8,、 此時(shí)會(huì)下載加載安裝包列表
9,、Search是可以輸入你要下載的包的名稱,能夠快速篩選出你要下載的包,。那四個(gè)單選按鈕是選擇下邊樹的樣式,,默認(rèn)就行,不用動(dòng),。View默認(rèn)是Category,,建議改成full顯示全部包再查,省的一些包被隱藏掉,。左下角那個(gè)復(fù)選框是是否隱藏過期包,,默認(rèn)打鉤,不用管它就行,,下邊開始下載我們要安裝的包吧,。
10,、 然后開始選擇安裝這些包吧,點(diǎn)skip,,把它變成數(shù)字版本格式,,要確保Bin項(xiàng)變成叉號(hào),而Src項(xiàng)是源碼,,這個(gè)就沒必要選了。
11,、 下面測(cè)試一下cygwin是不是已經(jīng)安裝好了,。
1 2 3 |
運(yùn)行cygwin,在彈出的命令行窗口輸入:cygcheck -c cygwin命令,,會(huì)打印出當(dāng)前cygwin的版本和運(yùn)行狀 態(tài),,如果status是ok的話,則cygwin運(yùn)行正常,。 然后依次輸入gcc –version,,g --version,make –version,,gdb –version進(jìn)行測(cè)試(或,,輸入make -v 和 gcc -v ),如果都打印出版本信息和一些描述信息,,非常高興的告訴你,,你的cygwin安裝完成了! |
Cygwin 安裝好了之后,,同樣的我們需要配置下環(huán)境變量:
1,、 首先找到cygwin的安裝目錄,找到一個(gè)home<你的用戶名>.bash_profile文件,,我的是:
E:cygwinhomeAdministrator.bash_profile,,(注意:可能home文件夾下面神馬都沒有,解決的辦法:首先打開環(huán)境變量,,把里面的用戶變量中的HOME變量刪掉,,在E:cygwinhome文件夾下建立名為Administrator的文件夾(是用戶名),然后把E:cygwinetcskel.bash_profile拷貝到該文件夾下),。
2,、 打開bash_profile文件,添加NDK=/cygdrive/<你的盤符>/ 例如:
NDK=/cygdrive/e/android-ndk-r8
export NDK
NDK這個(gè)名字是隨便取的,,為了方面以后使用方便,,選個(gè)簡(jiǎn)短的名字,然后保存.
3,、打開cygwin,,輸入cd $NDK,,如果輸出上面配置的/cygdrive/e/android-ndk-r8信息,則表明環(huán)境變量設(shè)置成功了,。
NDK環(huán)境變量設(shè)置成功后,,我們就可以試著ndk是否能夠運(yùn)行成功:
1、 現(xiàn)在我們用安裝好的NDK來編譯一個(gè)簡(jiǎn)單的程序吧,,我們選擇ndk自帶的例子hello-jni,,我的位于E:android-ndk-r8sampleshello-jni(根據(jù)你具體的安裝位置而定).
2、 運(yùn)行cygwin,,輸入命令cd /cygdrive/e/android-ndk-r8/samples/hello-jni,,進(jìn)入到E:android-ndk-r8sampleshello-jni目錄。
3,、 輸入$NDK/ndk-build,,執(zhí)行成功后,它會(huì)自動(dòng)生成一個(gè)libs目錄,,把編譯生成的.so文件放在里面,。($NDK是調(diào)用我們之前配置好的環(huán)境變量,ndk-build是調(diào)用ndk的編譯程序).
4,、 此時(shí)去hello-jni的libs目錄下看有沒有生成的.so文件,,如果有,你的ndk就運(yùn)行正常啦,!
完成以上操作其實(shí)NDK的環(huán)境已經(jīng)搭建完成了,。
但是我們習(xí)慣于用ecipse去開發(fā)app,那么是否可以在eclipse上面集成C/C 呢,?
在eclipse中集成c/c 開發(fā)環(huán)境
1,、 裝Eclipse的C/C 環(huán)境插件:CDT,這里選擇在線安裝Eclipse,。找到對(duì)應(yīng)你Eclipse版本的CDT插件的在線安裝地址,。
2、 然后點(diǎn)Help菜單,,找到Install New Software菜單
3,、 點(diǎn)擊Add按鈕,把取的地址填進(jìn)去,,出來插件列表后,,選Select All,然后選擇下一步即可完成安裝
4,、 安裝完成后,,在eclispe中右擊新建一個(gè)項(xiàng)目,,如果出現(xiàn)了c/c 項(xiàng)目,,則表明你的CDT插件安裝成功啦!
配置C/C 的編譯器
1,、 打開eclipse,導(dǎo)入ndk自帶的hello-jni例子,,右鍵單擊項(xiàng)目名稱,,點(diǎn)擊Properties,彈出配置界面,,之后再點(diǎn)擊Builders,,彈出項(xiàng)目的編譯工具列表,之后點(diǎn)擊New,,新添加一個(gè)編譯器,,點(diǎn)擊后出現(xiàn)添加界面,選擇Program,,點(diǎn) 擊OK.
2、出現(xiàn)了添加界面,,首先給編譯配置起個(gè)名字,,如:C_Builder
設(shè)置Location為<你cygwin安裝路徑>binbash.exe程序,例如:E:cygwinbinbash.exe,,設(shè)置Working Directory為<你cygwin安裝路徑>bin目錄,,例如:E:cygwinbin
設(shè)置Arguments為
--login -c "cd /cygdrive/I/JavaWorkSpace/Blog/NDK_02 && $NDK/ndk-build"
上面的配置中 /cygdrive/I/JavaWorkSpace/Blog/NDK_02是你當(dāng)前要編譯的程序的目錄,$NDK是之前配置 的ndk的環(huán)境變量,,這兩個(gè)根據(jù)你具體的安裝目錄進(jìn)行配置,,其他的不用變,Arguments這串參數(shù)實(shí)際是 給bash.exe命令行程序傳參數(shù),,進(jìn)入要編譯的程序目錄,,然后運(yùn)行ndk-build編譯程序
3、接著切換到Refresh選項(xiàng)卡,,給Refresh resources upon completion打上鉤
4,、然后切換到Build Options選項(xiàng)卡,勾選上最后三項(xiàng)
5,、之后點(diǎn)擊Specify Resources按鈕,,選擇資源目錄,勾選你的項(xiàng)目目錄即可
6,、 最后點(diǎn)擊Finish,,點(diǎn)擊OK一路把剛才的配置都保存下來,注意:如果你配置的編譯器在其它編譯器下邊,,記得一定要點(diǎn)Up按鈕,,把它排到第一位,否則C代碼的編譯晚于Java代碼的編譯,,會(huì)造成你的C代碼要編譯兩次才能看到最新的修改
配置完成后,,我們需要驗(yàn)證我們這么長(zhǎng)時(shí)間辛苦的配置了,我們只需要編寫相應(yīng)的C代碼與java端代碼去驗(yàn)證即可,,若偷懶可之間使用sample中的即可。
由于本篇主要講的是 NDK 環(huán)境搭建,,在這里代碼部分就不細(xì)講了,。