前言:編程世界當(dāng)中C/C++的的執(zhí)行效率是其它任何語言不能比擬的,在Android開發(fā)中你可能會(huì)接觸到Android系統(tǒng)中底層算法的使用,而這些算法多數(shù)都是用C/C++編寫的,如果你想在應(yīng)用層利用這些算法,通過Java直接調(diào)C是不可能的,所以在這類似的需求下,jni由此誕生了,讓java和其他語言能進(jìn)行交流。
1.基礎(chǔ)知識(shí)簡介:
- jni的全稱是java Native Interface.它的作用就是讓java能夠和其他編程語言進(jìn)行通信(主要是用于C/C++).
-
NDK的全稱是Native Development Kit,其實(shí)它就是一個(gè)幫助工具,幫助打包編譯等。
jni.png
從上到下總共分為三層,Native層提供最原始的C/C++接口代碼,接口代碼可以直接在JNI中引用。而Java層通過在方法前面添加native關(guān)鍵字,與jni中的方法進(jìn)行對應(yīng)(對應(yīng)的方式有兩種:靜態(tài)注冊和動(dòng)態(tài)注冊,下一篇將jni語法的時(shí)候會(huì)說明)。與java對應(yīng)的jni方法就可以調(diào)用native代碼了。這就是jni調(diào)用的簡單流程,就如上圖所畫的一樣.
2.代碼演示(no code no bb):
首先我們簡單看下工程目錄是什么樣的:

在這個(gè)完成工程中有幾個(gè)坑,稍后在完成demo的過程中進(jìn)行填坑.
jni環(huán)境配置
*1.在android studio配置一下jni環(huán)境,也就是打開File->Project Structure
在SDK Location選項(xiàng)下有個(gè)NDK的添加路徑。如下圖:

緊急提醒:如果你的Android Studio是比較新個(gè)版本,添加的NDK是r10*版本的話可能會(huì)錯(cuò)誤,錯(cuò)誤原因就是你的NDK版本過低了,需要在項(xiàng)目的gradle.properties中進(jìn)行說明
android.useDeprecatedNdk=true
*2.在local.properties中配置上NDK的路徑:

*3.最后將NDK的路徑在環(huán)境變量中進(jìn)行添加.
開始擼代碼:
- 1.創(chuàng)建一個(gè)對jni申明的類:

- 2.make一下工程,如果語法上沒有錯(cuò)誤,你會(huì)發(fā)現(xiàn)在builde里面會(huì)生成一個(gè)對應(yīng)的JniTestMldule.java所對應(yīng)的JniTestModule.class文件(如下圖)。這個(gè)文件為我們后面生成jni頭文件起決定性作用的.

- 3.為so庫生成jni的頭文件:
- 在build.gradle中配置編譯so庫所需要的文件,和最終生成so庫的名稱

- 編譯出so庫:直接在android studio的terminal終端執(zhí)行下圖代碼

緊急提示:注意我編譯時(shí)候命令是在那層目錄下執(zhí)行的,如果直接在*.class文件所在目錄下執(zhí)行javah **.class可能會(huì)有錯(cuò)。這樣可以確保不會(huì)出錯(cuò)的.
這里還有一個(gè)注意點(diǎn),上面的工程目錄的jni文件夾下,我添加了一個(gè)util.c,它里面上面都沒有,是一個(gè)空文件。為什么要這樣做呢?
因?yàn)閣indow平臺(tái)下用ndk編譯的時(shí)候,jni文件夾下,只有一個(gè).c文件編譯是通不過的,所以要加一個(gè)空的.c文件。在mac和linux下是沒有這種坑爹事情發(fā)生的。解決辦法是在這里看到的。
http://blog.csdn.net/sodino/article/details/41895211
- 4.上述編譯通過后,你在build/intermediates/ndk/debug/lib下面可以看到對應(yīng)不同平臺(tái)生成的so

so庫都出來了,就可以直接用jni的接口了.
