JNI全名为:Java Native Interface,用于连接Java和C/C++桥梁,通过JNI,Java语言可以调用C/C++的函数,反之C/C++也可以调用Java的变量和方法,一般使用环境为:当Java满足不了程序的需要,如算法、图像渲染等高性能消耗操作时,需要访问一些C/C++代码提高性能
NDK:工具的集合。帮助开放者快速开放C/C++ 动态库的工具。开发JNI不是必须使用NDK,它只不过方便我们使用而已
下面介绍JNI的基本使用:
1.由于考虑到安卓开发人员只有AS工具,这边就使用AS新建一个项目,并创建一个带有main函数的类:
package com.aruba.jniapplication;
public class JniDemo {
public static native String getStringFromC();
public static void main(String[] args) {
}
}
2.编写native方法
/**
* 调用C++语言获取一个字符串
* @return
*/
public static native String getStringFromC();
在cmd中执行javah命令,注意!!要切换目录到主包名下,我这边包名是com.aruba.jniapplication,所以我需要在存放com文件夹的目录下执行
生成了.h文件
3.编写C/C++代码之前,我们需要做一些准备操作
1.将jni.h 和jni_md.h复制到编译C/C++的环境
使用visual studio新建一个项目,并把两个.h文件放入,由于vs默认使用连接,不会复制文件到自己的项目中,所以我们手动把文件拷贝到vs的项目中,再通过右击-添加现有项的方式添加.h文件
2.将我们生成的.h文件也放入编译环境,名字可以随意修改
4.C++比C使用起来方便,所以我们现在开始在jni目录下编写C++代码
新建一个myJni.cpp
#include "my_jni.h"
#include <string>
using namespace std;
JNIEXPORT jstring JNICALL Java_com_aruba_jniapplication_JniDemo_getStringFromC
(JNIEnv* env, jclass jclz) {
//新建一个string对象
string s = "hello form C++";
jstring jstr = env->NewStringUTF(s.c_str());
return jstr;
}
5.生成动态库
将配置管理器中的平台修改成64位
右击项目,进入属性
改为生成动态库
点击上面菜单栏的生成,选择重新生成解决方案
最后成功生成动态库
将生成的dll复制到我们的AS项目中
6.Java中加载动态库,调用native方法
public class JniDemo {
static {
// System.out.println(System.getProperty("java.library.path"));
System.load("C:\\Users\\tyqhc\\Documents\\workspace\\JniApplication\\app\\src\\main\\java\\com\\aruba\\jniapplication\\myJni.dll");
// System.loadLibrary("myJni");
}
public static native String getStringFromC();
public static void main(String[] args) {
System.out.print(getStringFromC());
}
}
System.load方法需要传入绝对路径,我们来运行看下效果:
JNI的具体使用流程就这么些,之后会再介绍静态native函数和非静态native函数的区别,以及C/C++调用Java中的变量等