Android Studio增長NDK代碼編譯支持--Mac環境

  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文件了,很方便,固然咱們也能夠本身寫。

相關文章
相關標籤/搜索