Android Studio实现JNI的开发(基础)

最近看了一些关于Android JNI开发的文章,自己也动手实践了一下,写篇博客记录一下以便以后再用到

一、JNI简介

JNI——Java Native Interface,它是Java平台的一个特性(并不是Android系统特有的)。其实主要是定义了一些JNI函数,让开发者可以通过调用这些函数实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码,这样就可以发挥各个语言的特点。


二、开发环境
开发使用的环境配置:
JDK版本:1.7
AndroidStudio版本:2.2.3
NDK版本:ndk_r13b
NDK下载地址:https://developer.android.google.cn/ndk/downloads/index.html
Android Studio及JDK 下载地址:http://www.android-studio.org

由于开发环境已经配置好这里不再赘述,如需要可参考网上的一些文章。下面进入主题开始动手。

新建项目NativeApplication,如下图:

Android lanucher开发 安卓开发 jni_android studio

检查Android NDK Support插件

Android lanucher开发 安卓开发 jni_android_02

为项目配置NDK路径

Android lanucher开发 安卓开发 jni_android studio_03

配置好以后,就可以开始写代码了,首先在java文件夹下新建一个包cn.jni.demo,然后新建CallNative类,当然CallNative类也可以新建在原来的包名下,这个为了区分新建了一个包,如下图:

Android lanucher开发 安卓开发 jni_android_04

下面在CallNative类里面添加native方法,代码如下:

public class CallNative {

    public native int getVersion();
}

然后在工具栏【Build】->执行【Make Project】,执行成功后可以在
E:\ws_space\NativeApplication\app\build\intermediates\classes\debug\cn\jni\demo目录下看到CallNative.java类,如下图:

Android lanucher开发 安卓开发 jni_Android lanucher开发_05

然后在Android Studio 面板里的Terminal里面输入一下指令,生成对应的.h文件,命令如下:

1、cd app/src/main/java
2、javah -d ../jni cn.jni.demo.CallNative

如图:

Android lanucher开发 安卓开发 jni_Android_06

以上两条命令执行成功后,会生成jni的文件夹,该文件夹下有对应的cn_jni_demo_CallNative.h文件,如图:

Android lanucher开发 安卓开发 jni_Android_07

然后在jni文件夹下新建test.cpp文件,如下图:

Android lanucher开发 安卓开发 jni_android_08

接下来对build.gradle文件进行配置:

Android lanucher开发 安卓开发 jni_jni_09

对gradle.properties文件进行配置:

Android lanucher开发 安卓开发 jni_jni_10

配置好上述内容,执行菜单栏【Build】->【Rebuild Project】,执行成功后可在
E:\ws_space\NativeApplication\app\build\intermediates\ndk\debug\lib此目录下看到对应的.so文件,如图:

Android lanucher开发 安卓开发 jni_android studio_11

接下来修改CallNative.java里面的代码入下:

public class CallNative {

    public native int getVersion();

    static {
        System.loadLibrary("CallNative");
    }

}

Android lanucher开发 安卓开发 jni_jni_12

最后就可以在MainActivity里面调用CallNative里面的native方法了,代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CallNative callNative = new CallNative();
        Log.i(TAG, "version code :" + callNative.getVersion());
    }
}

运行后,可以在控制台看到输出如下:

Android lanucher开发 安卓开发 jni_android_13

至此就完成了jni的简单调用