android studio NDK編程

以前總是覺得NDK編程挺麻煩的,c語言還好,主要是自己看不懂c++的代碼,但是現在項目有需求,看了一下高斯模糊的實現,使用c語言是Java的30倍左右,於是爲了咱的項目也能高大上,所以需要使用c語言去做模糊處理。

1. 首先下載NDK
NDK_r10下載鏈接
提取密碼:51f7
2. window下環境變量配置
我的ndk的目錄位置如下:
這裏寫圖片描述

在window系統環境變量中,新建 變量名:ANDROID_NDK_ROOT,變量值即爲你的ndk的安裝目錄,如下圖所示:
這裏寫圖片描述
完整的變量值:D:\PROGRA~1\Android\android_ndk\android-ndk-r10d
這裏面需要注意的是如果你的NDK安裝目錄是在Program Files下面,則需要使用PROGRA~1來替換Program Files。
接下來在x系統環境變量PATH前面添加:%ANDROID_NDK_ROOT%\;
如圖所示:
這裏寫圖片描述
到此我們的環境變量配置已經完成了,測試一下是否可用,打開命令行工具,輸入:ndk-build -version
如果出現如下所示情況,即爲配置成功!
這裏寫圖片描述
接下來我們配置需要ndk-build的項目。

3. android studio jni目錄和本地文件

  1. 在項目中新建jni目錄
    目錄結構如圖所示:
    這裏寫圖片描述
  2. 創建android.mk和application.mk文件c文件或者c++文件
    android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := blur
LOCAL_SRC_FILES := blur.c

LOCAL_CFLAGS    =  -ffast-math -O3 -funroll-loops
LOCAL_LDLIBS    := -lm -llog -ljnigraphics -landroid
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include-all

include $(BUILD_SHARED_LIBRARY)

application.mk

APP_ABI := all
APP_CFLAGS += -fexceptions
APP_STL := gnustl_static

c文件,這裏面需要注意的是c文件裏面的函數名稱:
例如:我需要在下面這個類中使用native函數

class NativeBlurProcess implements BlurProcess {

    private static native void functionToBlur(Bitmap bitmapOut, int radius, int threadCount, int threadIndex, int round);

    static {
        System.loadLibrary("blur");
    }
    }

在命令行或者android studio Terminal下面切換到main目錄下輸入:
javah -d jni -classpath “D:\Program Files\Android\android_sdk\android-sdk\android-sdk\platforms\android-23\android.jar”;….\build\intermediates\classes\debug com.yjjy.app.utils.NativeBlurProcess

就會自動生成.h文件。可以編輯我們需要的c文件或者c++文件。
如果有現成的c文件,那麼我們需要把c文件中的函數名稱更改爲我們上面native函數的路徑加包名:
如下所示:Java_com_yjjy_app_utils_NativeBlurProcess_functionToBlur
NativeBlurProcess所在目錄結構如圖所示:
這裏寫圖片描述
則函數名是:Java_com_yjjy_app_utils_NativeBlurProcess_functionToBlur,對比一下可以看出規律來吧。

4.編譯動態鏈接庫.so文件

在命令行中切換到jni目錄的父目錄中,如下所示:我的jni目錄在main目錄下面:

這裏寫圖片描述
在命令行中切換到jni目錄的父目錄中輸入:ndk-build
這裏寫圖片描述
這樣即可編譯成功了。

5.編譯成功之後

這裏寫圖片描述

會出現圖所示的兩個文件,libs中即爲我們所需要的so文件。
我們需要在項目main下面新建jniLibs文件夾,這個是android studio所能識別動態庫so的默認目錄

這裏寫圖片描述

當然也可以使用其他目錄,但是這樣就需要在android studio的build.gradle中配置路徑了

android{

...
sourceSets.main{

  jniLibs.srcDir 'src/main/jni_libs'//單引號內即爲其他目錄路徑
}


}

6.常見錯誤

fatal error:android/bitmap.h No such file or directory #include <android/bitmap.h>

上面這個錯誤我也醉了,弄了好幾個小時,只需要build的時候輸入
ndk-build APP_PLATFORM=android-21即可。android_xx 後面的版本號看你所需要包含的頭文件所在的版本 其實是我忘記在Application.mk 添加platform 版本了

這裏寫圖片描述

在build.gradle中添加

   sourceSets {
        main {
            jni.srcDirs = []
        }
    }
發佈了87 篇原創文章 · 獲贊 126 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章