android studio NDK编程

以前总是觉得NDK编程挺麻烦的,c语言还好,主要是自己看不懂c++的代码,但是现在项目有需求,看了一下高斯模糊的实现,使用c语言是Java的30倍左右,于是为了咱的项目也能高大上,所以需要使用c语言去做模糊处理。

1. 首先下载NDK
NDK_r10下载链接
提取密码:51f7
2. window下环境变量配置
我的ndk的目录位置如下:
android studio NDK编程_第1张图片

在window系统环境变量中,新建 变量名:ANDROID_NDK_ROOT,变量值即为你的ndk的安装目录,如下图所示:
android studio NDK编程_第2张图片
完整的变量值:D:\PROGRA~1\Android\android_ndk\android-ndk-r10d
这里面需要注意的是如果你的NDK安装目录是在Program Files下面,则需要使用PROGRA~1来替换Program Files。
接下来在x系统环境变量PATH前面添加:%ANDROID_NDK_ROOT%\;
如图所示:
android studio NDK编程_第3张图片
到此我们的环境变量配置已经完成了,测试一下是否可用,打开命令行工具,输入:ndk-build -version
如果出现如下所示情况,即为配置成功!
android studio NDK编程_第4张图片
接下来我们配置需要ndk-build的项目。

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

  1. 在项目中新建jni目录
    目录结构如图所示:
    android studio NDK编程_第5张图片
  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所在目录结构如图所示:
android studio NDK编程_第6张图片
则函数名是:Java_com_yjjy_app_utils_NativeBlurProcess_functionToBlur,对比一下可以看出规律来吧。

4.编译动态链接库.so文件

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

android studio NDK编程_第7张图片
在命令行中切换到jni目录的父目录中输入:ndk-build
android studio NDK编程_第8张图片
这样即可编译成功了。

5.编译成功之后

android studio NDK编程_第9张图片

会出现图所示的两个文件,libs中即为我们所需要的so文件。
我们需要在项目main下面新建jniLibs文件夹,这个是android studio所能识别动态库so的默认目录

android studio NDK编程_第10张图片

当然也可以使用其他目录,但是这样就需要在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 后面的版本号看你所需要包含的头文件所在的版本

android studio NDK编程_第11张图片

在build.gradle中添加

   sourceSets {
        main {
            jni.srcDirs = []
        }
    }

你可能感兴趣的:(编程,android,android,C语言,NDK,Studio)