Android的APP開發基本都是使用Java或者跨平臺框架進行開發的,對於不少APP來講已經足夠了,可是,對於提供功能給外部使用或者性能要求很高的需求下,如圖像處理等,可能會須要C/C++庫的支持,這就須要藉助NDK,另外,NDK在能夠起到代碼保護的做用,由於其反編譯查看源碼難度比java更大。java
Java代碼是不能直接調用原生的C++代碼的,C++代碼須要藉助NDK暴露一個本地接口給JAVA來調用的,原理不少資料都有介紹,這裏就不重複了,這裏,主要演示一下在Android Studio下如何集成這個編譯環境,這裏基於蘋果的Mac OS X系統來搭建,蘋果內核本來就是UNIX的,所以,環境搭建相對Windows方便不少,沒在Windows搭建過,應該也不難。架構
1. 新建一個測試工程,工程名爲:TestJNI:app
2. 在app/build.gradle的默認配置塊聲明庫名稱和生成的CPU架構文件,這裏模塊名稱是"JimOpencvLibs",那麼,對應生成的so庫文件名就是「lib+模塊名.so」了:框架
ndk{ moduleName "JimOpencvLibs" abiFilters "armeabi", "armeabi-v7a", "x86" }
3. 在gradle.properties文件聲明使用NDK支持,如第18行所示:性能
4. 在工程屬性設置設置好NDK的路徑,建議使用Android Studio內置最新的NDK版本,不然會遇到編譯不經過問題:測試
5. 在app的src路徑下新建一個jni文件夾,用戶存放咱們的cpp文件:gradle
6. 在須要使用C++代碼的activity類聲明加載的庫和方法,注意:該聲明的方法前有」native「關鍵字:ui
7. 進入app/src/main/java目錄下執行下圖命令:blog
將生成一個頭文件「cn_linjk_testjni_MainActivity.h」,內容以下:接口
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class cn_linjk_testjni_MainActivity */ #ifndef _Included_cn_linjk_testjni_MainActivity #define _Included_cn_linjk_testjni_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: cn_linjk_testjni_MainActivity * Method: jimOpencvLibsTest * Signature: ()I */ JNIEXPORT jint JNICALL Java_cn_linjk_testjni_MainActivity_jimOpencvLibsTest (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
在第6步裏,咱們聲明瞭一個本地方法:public native int jimOpencvLibsTest();,在這個頭文件中,就會按Java_包名_類名_方法名聲明一個jni方法,咱們接下來就須要實現這個方法。
8. 實現生產的頭文件的方法:
這裏新建了一個測試類。
9. 測試native方法調用:
剛剛在cpp方法是返回10+20的結果,這裏看到輸出結果是30,調用沒問題了,後面能夠繼續擴展cpp類實現更多功能就能夠了。
10. 咱們看看生成的so庫的地方:
能夠看到,Android Studio已經幫咱們生成了mk文件了,很方便,固然咱們也能夠本身寫。