很早使用eclipse+ndk研究过jni开发,当时觉得配置、开发起来很麻烦,现在使用Android Studio开发jni,相对觉得比较容易。
先说明一下开发环境
Mac OS X 10.11
Android Studio 2.0
现在开始一步一步地进行jni开发。
首先,使用AS创建一个project,命名为JniDemo
如果没有安装NDK,安装NDK。 已安装,可略过。
打开项目设置对话框,如果没有安装NDK, 在Android NDK Location位置就会有Download按钮,可下载安装NDK。
新建一个java类EnUtils, 增加两个native方法。如图。
Rebuild Project之后,build/intermediates/classes/debug目录下就会生成 EnUtils.class文件
进入到debug目录下,执行javah命令,就会生成一个头文件 com_martin_jnidemo_EnUtils.h
命令:javah -jni com.martin.jnidemo.EnUtils
src/main目录下,创建jni目录,把之前生成的头文件复制到jni目录下。
在jni目录下,创建c源文件,文件名可随意。
函数实现,如图。
这一步之后就可以Rebuild Project了,但会出错,依据提示修改gradle即可。
配置gradle
1. 在gradle.properties中增加一行android.useDeprecatedNdk=true
2. 在app的build.gradle的defaultConfig中增加
ndk {
moduleName "EnUtilsName" //so名字
abiFilters "armeabi", "armeabi-v7a", "x86", "x86_64"
}
到此为止,再Rebuild Project,就生成了so文件。如图。
接下来就是如何使用调用so库文件了。
在EnUtils类中添加加载so库的代码,名称要和build.gradle中定义的ndk moduleName一致。
static { System.loadLibrary("EnUtilsName"); }
调用没有什么特别的,如图。
运行效果
以上是ndk jni开发的步骤。
下面将要介绍,编译生成的so文件如何单独使用。
1. 删除jni目录,以及目录下的.h .c文件
2. build.gradle中ndk配置也删除掉。
在src/main下创建jniLibs目录,再将ndk/debug/lib下的4个so目录复制到jniLibs目录下。
再重新Clean Project, Rebuild Project即可。
示例代码1,so库开发:http://download.csdn.net/detail/lm1391058/9499676
示例代码2,so库使用:http://download.csdn.net/detail/lm1391058/9499679