前期準(zhǔn)備
1.下載NDK開發(fā)需要的工具包:https://developer.android.com/ndk/downloads/index.html,我使用的是r9d的開發(fā)包
2.配置ndk環(huán)境變量(后面要使用ndk-build命令,編譯項(xiàng)目)
編譯ndk目錄下的demo項(xiàng)目
首先我們來看下ndk下載下來后自帶的demo來運(yùn)行一次,ndk下載下來后,解壓,目錄下有個(gè)sample目錄,在Eclipse中導(dǎo)入hello-jni這個(gè)項(xiàng)目

打開cmd命令窗口,進(jìn)入Eclipse工作空間中的hello-jni項(xiàng)目目錄下(如果在導(dǎo)入Eclipse的時(shí)候,沒有勾選復(fù)制到工作區(qū)空間,就要進(jìn)入ndk下,反正就是進(jìn)入hello-jni目錄下),然后執(zhí)行ndk-build命令(這就是前面說的先配置好ndk的環(huán)境變量,沒配置的話,進(jìn)入ndk解壓目錄在路徑欄直接cmd然后回車)

OK,現(xiàn)在刷新一下Eclipse中的helloJni項(xiàng)目,你就能看到多了一個(gè)obj文件夾,下面就是so文件,然后就可以運(yùn)行了,運(yùn)行后的截圖:

新建NDK項(xiàng)目
主要步驟:
? ? ?1.在Java文件中編寫JavaNative代碼
? ? ?2.使用javah命令根據(jù)native方法生成頭文件
? ? ?3.新建.c文件實(shí)現(xiàn)頭文件
? ? ?4.新建Android.mk文件
? ? ?5.加載動(dòng)態(tài)鏈接庫(kù)
一:在Java文件中編寫JavaNative代碼
新建項(xiàng)目,在MainActivity中寫上一句native代碼

二:使用javah命令根據(jù)native方法生成頭文件
在項(xiàng)目上右鍵-->新建文件夾名字為jni,打開cmd,進(jìn)入項(xiàng)目所在目錄(我的目錄E:\eclipse4.5workspace\NDKProject),執(zhí)行javah命令,可以先看下javah命令的一些參數(shù):

OK,然后我們輸入:javah -classpth bin/classes -d jni com.lhq.ndkproject.MainActivity,我們來解釋下這句命令:
使用javah命令,指定你要加載的類的文件目錄(-classpath),然后指定頭文件文件輸出目錄(-d jni,指定到j(luò)ni目錄,因?yàn)槲覀兦懊嫘陆薺ni的文件夾,不新建也行,它會(huì)自動(dòng)創(chuàng)建,在你執(zhí)行javah命令的目錄下),然后加上JavaNative代碼所在類的完整類名(包名+類名,所以,上面的classpath的參數(shù)注意了,輸入到你要生成的頭文件的源文件所在的目錄,不然會(huì)找不到),然后回車

但是出錯(cuò)了,說找不到activity,因?yàn)槲覀冞@個(gè)native方法是寫在MainActivity里面的,但是MainActivity是繼承了Activity的,它找不到Activity這個(gè)類(如果native方法是寫在一個(gè)單獨(dú)Java文件中,不會(huì)出這個(gè)錯(cuò)),我們更改下命令在bin/classes目錄后加一個(gè)分號(hào),然后去把Activity加進(jìn)來,那怎么加進(jìn)來呢?,去你的sdk目錄下的platforms中隨便找一個(gè)版本的然后進(jìn)去,比如我進(jìn)入的是android-21,然后目錄下有個(gè)android.jar文件,我們要的就是它,復(fù)制下文件路徑,在剛才命令classes的分號(hào)后面粘貼(如果是單獨(dú)的Java文件就不需要這樣),然后執(zhí)行命令

再進(jìn)入Eclipse刷新一下,在jni目錄下多了一個(gè).h的頭文件

三:新建.c文件實(shí)現(xiàn)頭文件
現(xiàn)在我們要實(shí)現(xiàn)這個(gè)頭文件,新建一個(gè).c為后綴的文件,隨便叫啥,我取個(gè)hello.c

hello.c文件現(xiàn)在是空的,我們來實(shí)現(xiàn)它,在hello.c中需要新引入c的一些庫(kù)的頭文件:stdio,stdlib,當(dāng)然還有自己的com_lhq_ndkproject_MainActivity.h頭文件

然后到.h文件中找到我們開始在MainActivity中寫的那個(gè)native方法所對(duì)應(yīng)的頭文件中的方法,到.h中找到這個(gè)方法,然后復(fù)制到剛修改過的.c文件中,做好相應(yīng)修改保存

四:新建Android.mk文件
現(xiàn)在已經(jīng)實(shí)現(xiàn)了頭文件,接下來我們到ndk中的demo,就是我們前面運(yùn)行的那個(gè)demo中,復(fù)制Android.mk這個(gè)文件到我們自己項(xiàng)目的jni目錄下,并做相應(yīng)修改:LOCAL_MODULE為編譯后的so庫(kù)名字(這個(gè)你想叫什么都行),LOCAL_SRC_FILES為你要編譯的這個(gè)文件的路徑

現(xiàn)在我們打開cmd命令窗口,進(jìn)入當(dāng)前項(xiàng)目目錄下執(zhí)行ndk-build命令,然后Eclipse中刷新項(xiàng)目,會(huì)發(fā)現(xiàn)多了一個(gè)obj文件夾,里面有我們剛編譯的so動(dòng)態(tài)鏈接庫(kù)


五:加載動(dòng)態(tài)鏈接庫(kù)
編譯好的so文件會(huì)在前面加上lib前綴,但是我們?cè)诩虞d的時(shí)候不需要寫,直接寫Android.mk中指定的文件名就行了

運(yùn)行成功?。?!

配置自動(dòng)編譯
到目前為止,我們的ndk項(xiàng)目就能正常運(yùn)行了,但是,我們每改一次c代碼都要手動(dòng)的用ndk-build編譯,那我們來配置下自動(dòng)編譯:
在項(xiàng)目上右擊,然后選擇properties,然后在彈出窗口中選擇Builders,再點(diǎn)擊new

然后選擇Program點(diǎn)擊ok

然后點(diǎn)擊Browse File System

選擇ndk目錄下的ndk-build.cmd文件


OK,再配置下Working Direcroty,點(diǎn)擊Browse Workspace選擇自己的項(xiàng)目

OK,然后點(diǎn)擊Build Optionsg勾選During auto builds然后點(diǎn)擊OK,到此為止,項(xiàng)目就不用每次都手動(dòng)ndk-build了

****************************************如果轉(zhuǎn)載請(qǐng)注明出處***********************************************