简介
JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
本地代码与 Java 虚拟机之间是通过 JNI 函数实现相互操作的。JNI 函数通过接口指针来获得,本地方法将 JNI 接口指针当作参数来接受。虚拟机保证在从相同的 Java 线程中对本地方法进行多次调用时,传递给本地方法的接口指针是相同的,本地方法被不同的 Java 线程调用时,它接受不同的 JNI接口指针。
使用JNI和算法进行交互,主要是为了提高算法的性能,最大化的利用机器硬件资源。
JAVA端
1.首先编写native方法
public class JniJavaTest {
public static native int jniSum(int x, int y);
public static native String jniHello(String name);
}
2.执行编译
因为我使用的是java jdk11,所以直接到jdk的目录下进行执行。
D:\Library\jdk-11.0.15\bin>javac E:\090-WORKSPACE\jnitest01\jnitest01\JniJavaTest.java
这样就会生成一个.class文件
3.生成.h文件,C++编码需要引用的
D:\Library\jdk-11.0.15\bin>javac -h E:\090-WORKSPACE\jnitest01\jnitest01\ E:\090-WORKSPACE\jnitest01\jnitest01\JniJavaTest.java
这样就会在目录下生成一个.h文件
JniJavaTest.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniJavaTest */
#ifndef _Included_JniJavaTest
#define _Included_JniJavaTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JniJavaTest
* Method: jniSum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_JniJavaTest_jniSum
(JNIEnv *, jclass, jint, jint);
/*
* Class: JniJavaTest
* Method: jniHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_JniJavaTest_jniHello
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
C++ 端
我这边采用的是Visual Studio 2022
1.创建一个Demo动态库
名称为JniDll,初始化文件如下:
2.创建一个类,并把.h文件的内容复制进去
如果提示无法打开源文件jni.h,主要原因是没有加载jni库。
在VS项目中右键,选择“属性”,在弹出的窗口中选择“VC++ 目录”,然后编辑右侧的“包含目录”
选择D:\Library\jdk-11.0.15\include和D:\Library\jdk-11.0.15\include\win32
3.实现.h方法并编译
Java调用库执行
1.获得当前运行库的位置
public static void main(String[] args) {
//打印库的位置
System.out.println(System.getProperty("java.library.path"));
}
2.把DLL复制进去
3.执行
/**
* @author zhe.xiao
* @date 2023-04-03 20:01
* @description
**/
public class JniJavaTest {
public static native int jniSum(int x, int y);
public static native String jniHello(String name);
static {
System.loadLibrary("JniDll");
}
public static void main(String[] args) {
//打印库的位置
System.out.println(System.getProperty("java.library.path"));
int i = JniJavaTest.jniSum(5, 5);
System.out.println(i);
String s = JniJavaTest.jniHello("zhexiao");
System.out.println(s);
}
}