以前总是觉得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    := blurLOCAL_SRC_FILES := blur.cLOCAL_CFLAGS    =  -ffast-math -O3 -funroll-loopsLOCAL_LDLIBS    := -lm -llog -ljnigraphics -landroidLOCAL_C_INCLUDES := $(LOCAL_PATH)/include-allinclude $(BUILD_SHARED_LIBRARY)

application.mk

APP_ABI := allAPP_CFLAGS += -fexceptionsAPP_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 后面的版本号看你所需要包含的头文件所在的版本

在build.gradle中添加

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

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)图片Bitmap保存到内存卡
  6. IOS APP发布的几个要点
  7. ubuntu下编译android源码、linux内核、android的源码结构以及编
  8. Android软件自动更新升级(自动下载安装新版本)
  9. 初级——程序如何打包成apk文件

随机推荐

  1. PHP跨域问题解决方案
  2. 深度解析Nginx下的PHP框架路由实现
  3. php查询数据库并输出乱码
  4. PHP生成有背景的二维码图片
  5. php关于日期时间的操作
  6. php策略模式和适配器模式的区别
  7. windows定时执行PHP文件
  8. ThinkPHP利用.htaccess文件的Rewrite规则
  9. PHP错误处理函数
  10. php命令行下相对路径问题的解决方法