安装配置NDK
下载
http://developer.android.com/intl/zh-cn/ndk/downloads/index.html#download
下载后运行exe程序会在当前目录下解压缩出来NDK的所有文件,移到本地的目录下。
配置环境变量
打开windows系统,属性,环境变量,定义下面两个部分:
前者为NDK文件放置的目录,后者为:%NDK_ROOT%;注意分号。
验证
cmd里面输入ndk-build,没有提示找不到差不多配置就算完成了。(正确应提示could not find application…)
配置android studio环境
1
在gradle.properties文件中添加 Android.useDeprecatedNdk = true
其中gradle.properties在工程目录下(注意:不是gradle–wrapper目录下的这个文件)。
2
在当前android studio的工程设置面板(工程名字上右键open module Setting或F4),在弹出的界面中选中SDK Location,配置好最下面的NDK location,找到对应的目录,我的已经配置好的。
3
在工程目录下的local.porperties文件中添加为下面样式:
ndk.dir=D:\\Android\\sdk\\ndk-bundle
sdk.dir=D:\\Android\\sdk
我的工程在新建后已经默认生成好了这个内容。
4
在gradle文件中添加以下内容(图片1处),该app的gradle文件中。
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
有的文档说也需要添加以下的内容在gradle中(图片2处)
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
声明native方法与编译
这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。
这儿需要新建一个类,不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity。
public class myJNI {
//加载so库
static {
System.loadLibrary("JniTest");
}
//native方法
public static native String sayHello();
}
编译
这儿的路径部分很重要。
可以在android studio的终端下的命令行工具里面编译,打开该工具的方法为软件最下方的Terminal。如果没有的话可以点击菜单栏的view–Tool Windows–Terminal。
class文件
打开后当前命令行处于的目录部分不确定,首先将那个native所在的方法编译为class文件。
F:\Temp\Other\JNI\myJni\app\src\main\java\app\tongbang\com\myjni>javac myJNI.java
注意目录部分。
PS:好像可以
执行Build->Cliear Project和Rebuild Project生成class文件
h文件
接着编译h文件,需要更换目录,这里的路径变更使用cd命令(不会cd命令的百度cmd进出文件夹方法),如下所示:
F:\Temp\Other\JNI\myJni\app\src\main\java>javah -jni app.tongbang.com.myjni.myJNI
到达工程的java目录下,注意最后面的app.tongbang.com.myjni为工程的包名,myJNI为类名,编译成功后会在工程的包名下生成文件app_tongbang_com_myjni_myJNI.h
构建C文件
在编译好h文件后,打开该h文件,复制全部内容,在工程目录下的app–src–main下新建文件夹jni,再在里面新建c文件比如main.c,将h文件的内容复制到里面,注意的是,这儿的文件内容是头文件的文件内容,所以必需要把原本的函数声明内容变更为具体的函数内容实现。
此外,在写完c文件后,需要在该目录(jni)下新建一个c文件,名字为util.c,内容为空,网上有的帖子说不加这个文件会报错,但是我没有加成功实现了,可加可不加。
如果前面的步骤正常,那么此时编译应该可以成功了。可以实体化带有调用c程序的类,使用里面的方法。
生成so库与使用
在工程编译成功后,so库也已经成功产生,在项目的app\build\intermediates\ndk\debug\lib路径下
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下
流程
编写静态方法(用java声明)–>编译生成class文件—>编译生成h文件—->编写C文件(用C/C++实现)
—->配置NDK—->配置so库—->在Activity调用(Java调用C/C++)。