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目录和本地文件
- 在项目中新建jni目录
目录结构如图所示:
- 创建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 = [] } }
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Android(安卓)图片Bitmap保存到内存卡
- IOS APP发布的几个要点
- ubuntu下编译android源码、linux内核、android的源码结构以及编
- Android软件自动更新升级(自动下载安装新版本)
- 初级——程序如何打包成apk文件