Android studio配置NDK

Android开发在对接一些三方功能或者算法时,常常涉及JNI的开发,一般只需要把so文件放入指定目录,然后写好对接接口,load入so库,就可以使用了。但在AS自己搞的时候,发现对JNI开发的步骤还是有点生疏,以此文记录下整个配置过程。

1.NDK的安装,NDK是JNI开发的工具,可以上Google官网下载,也可以直接在AS里下载,如下图,在SDK tools里勾选后直接apply,就开始下载了,过程比较久,耐心等待,下载完成后在SDK路径下会有个NDK的文件。Android studio配置NDK_第1张图片


2.下载完NDK,需要在AS里配置NDK的路径,这个跟配置SDK路径一样:

Android studio配置NDK_第2张图片

3.配置NDK环境变量。为了方便使用,将NDK的路径配置到环境变量中,然后启动命令行,输入ndk-build,如下显示,则NDK安装成功且环境变量已经配置好了。

Android studio配置NDK_第3张图片

4.新建一个demo项目jnidemo来记录JNI开发流程,项目创建完毕,打开gradle.properties文件,输入android.useDeprecatedDdk=true,否者后面编译时会提示相关错误。

Android studio配置NDK_第4张图片

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文件:

Android studio配置NDK_第5张图片

6.输入命令javah -jni com.example.mr5.jnidemo.JniUtil    (包名+类名)

如果报找不到该类的错误,用javah -classpath . -jni com.example.mr5.jnidemo.JniUtil。

此命令将生成与JniUtil类对应的.h文件。成功后将在包目录下生成一个com_example_mr5_jnidemo_JniUtil.h文件。

Android studio配置NDK_第6张图片


7.新建一个jni文件夹,将刚刚生产的.h文件剪切到jni文件夹下面,并创建一个C/C++文件hello.c。

Android studio配置NDK_第7张图片

hello.c的方法名必须跟.h文件中的方法名一致。这里的方法内容返回“HelloWorld!”

Android studio配置NDK_第8张图片

8.配置gradle,打开app的gradle,在defaultConfig下面加入NDK的编译配置,这里的moduleName跟loadLibrary的时候用的名字必须相同:

Android studio配置NDK_第9张图片

9.Build——>Make Project,运行完成后,文件目录切换成Project,可以看到生成了对应cpu类型的so库:

Android studio配置NDK_第10张图片

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());

    }
}
运行结果如下:

Android studio配置NDK_第11张图片

你可能感兴趣的:(android)