Android开发在对接一些三方功能或者算法时,常常涉及JNI的开发,一般只需要把so文件放入指定目录,然后写好对接接口,load入so库,就可以使用了。但在AS自己搞的时候,发现对JNI开发的步骤还是有点生疏,以此文记录下整个配置过程。
1.NDK的安装,NDK是JNI开发的工具,可以上Google官网下载,也可以直接在AS里下载,如下图,在SDK tools里勾选后直接apply,就开始下载了,过程比较久,耐心等待,下载完成后在SDK路径下会有个NDK的文件。
2.下载完NDK,需要在AS里配置NDK的路径,这个跟配置SDK路径一样:
3.配置NDK环境变量。为了方便使用,将NDK的路径配置到环境变量中,然后启动命令行,输入ndk-build,如下显示,则NDK安装成功且环境变量已经配置好了。
4.新建一个demo项目jnidemo来记录JNI开发流程,项目创建完毕,打开gradle.properties文件,输入android.useDeprecatedDdk=true,否者后面编译时会提示相关错误。
5.在包名下新建一个JniUtil.java文件,
package com.example.mr5.jnidemo;
public class JniUtil {
static {
System.loadLibrary("jnidemo");//名字必须和build.gradle中的moduleName一致
}
public static native String sayHello();
}
用AS自带的命令行,进入到项目文件夹目录,输入命令 javac JniUtil.java,将java文件编译成.class文件:
6.输入命令javah -jni com.example.mr5.jnidemo.JniUtil (包名+类名)
如果报找不到该类的错误,用javah -classpath . -jni com.example.mr5.jnidemo.JniUtil。
此命令将生成与JniUtil类对应的.h文件。成功后将在包目录下生成一个com_example_mr5_jnidemo_JniUtil.h文件。
7.新建一个jni文件夹,将刚刚生产的.h文件剪切到jni文件夹下面,并创建一个C/C++文件hello.c。
hello.c的方法名必须跟.h文件中的方法名一致。这里的方法内容返回“HelloWorld!”
8.配置gradle,打开app的gradle,在defaultConfig下面加入NDK的编译配置,这里的moduleName跟loadLibrary的时候用的名字必须相同:
9.Build——>Make Project,运行完成后,文件目录切换成Project,可以看到生成了对应cpu类型的so库:
10.app中调用jni方法:
package com.example.mr5.jnidemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(JniUtil.sayHello());
}
}
运行结果如下: