以前總是覺得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目錄和本地文件
- 在項目中新建jni目錄
目錄結構如圖所示:
- 創建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 = []
}
}