一、概述
JNI是Java Native Interface的缩写,提供一些API实现了Java和C&C++语言的通信。以下示例开发用的工具是android stduio。
二、NDK环境配置
1.配置gradle.properties文件
android.useDeprecatedNdk=true
2.下载NDK文件配置local.properties文件。如果NDK已经下载,直接配置使用就可以
sdk.dir=/Users/Desktop/sdk/sdk
ndk.dir=/Users/Desktop/android-ndk-r11b
3.配置gradle
二、Jni示例
1、新建一个工程,创建JniUtils.class,在内部声明native方法。
public class JniUtils {
public native String getCLassString();
public native int getInt(int i,int y);
}
2、在MainActivity文件中调用声明JNI的方法。
public class MainActivity extends AppCompatActivity {
private TextView mJinText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init()
}
public void init(){
mJinText = (TextView)findViewById(R.id.jni_tv);
JniUtils ndkJniUtils = new JniUtils();
mJinText.setText(ndkJniUtils.getCLassString());//ndkJniUtils.getInt(1,2)也可以调用此方法
}
}
3、编译运行代码。得到.class文件。
JniDemo\app\build\intermediates\classes\debug
4、生成.h文件
1.从命令行或android studio自带的Terminal进入项目目录debug根目录下。
>cd JniDemo\app\build\intermediates\classes\debug
2.在debug目录下执行javah命令生成h文件
debug> javah -jni demo.jni.cn_jnidemo.JniUtils
5、查看.h文件
1.执行完生成.h指令后,可以在JniDemo\app\build\intermediates\classes\debug 目录下看到该文件
.h文件内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class demo_jni_cn_jnidemo_JniUtils */
#ifndef _Included_demo_jni_cn_jnidemo_JniUtils
#define _Included_demo_jni_cn_jnidemo_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: demo_jni_cn_jnidemo_JniUtils
* Method: getClassString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getClassString
(JNIEnv *, jobject);
/*
* Class: demo_jni_cn_jnidemo_JniUtils
* Method: getInt
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getInt
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
6.在app/src/main目录下创建jni文件夹。把.h文件拷贝进来。
7.在jni目录下新建jni.c文件。文件名称可以自定义。.c文件实现我们需要的方法
查看.c文件
#include "demo_jni_cn_jnidemo_JniUtils.h"
JNIEXPORT jstring JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getClassString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"Android!");
}
JNIEXPORT jint JNICALL Java_demo_jni_cn_jnidemo_JniUtils_getInt
(JNIEnv *env, jobject obj, jint x, jint y) {
int res = x + y;
return res;
}
8.在JniUtils中添加loadLibrary方法。
public class JniUtils {
static {
System.loadLibrary("JniLib");
}
public native String getClassString();
public native int getInt(int i, int y);
}
9.运行