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 = []
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值