JNI即Java Native Interface,是Java平台上的一种机制,用于实现Java虚拟机和本地代码之间的交互。通过JNI,Java程序可以调用本地库(native library)中的函数,也可以将Java代码暴露给本地代码调用。
由于Java虚拟机以及大部分Java类库都是用Java语言实现的,因此无法直接访问一些本地系统资源(例如操作系统的API,硬件接口等),这就需要通过JNI技术来实现。
JNI提供了一系列的API,可以用于从Java代码中调用本地C/C++函数,也可以将Java对象转换为本地C/C++中的数据类型,从而实现Java和本地代码之间的数据传递。
JNI还提供了一系列的函数,可以用于在本地代码中调用Java代码,从而实现Java和本地代码之间的双向交互。
JNI的使用需要一定的C/C++语言基础,也需要了解Java虚拟机的内部工作原理,因此使用时需要仔细考虑。
下面是java程序类调用
1. 编写TestJNI java类,使用native关键字调用C
System.load()为文件的绝对路径,或相对路径下的动态库文件的全限定名称
System. loadLibrary() 文件的相对路径, 这里,必须是在java.library.path这一jvm变量所指向的路径中。
package com.result.jni;
public class TestJNI {
static {
System.load("D:\Test.dll"); // 加载名为Test的C动态库
}
private native void sayHello(); // JNI调用C语言函数
//C++ JNI 方法名是根据包名+类名生成的
public static void main(String[] args) {
new TestJNI().sayHello(); // 调用JNI函数
}
}
2. 我们需要使用C语言实现一个名为hello.c
的文件,该文件包含void sayHello()
函数。以下是C代码
#include <jni.h>
#include <stdio.h>
#include "TestJNI.h" // 包含Java生成的头文件
JNIEXPORT void JNICALL Java_com.result.jni_TestJNI_sayHello(JNIEnv *env, jobject obj) {
printf("Hello World!\n"); // 输出Hello World!
return;
}
Java_com.result.jni_TestJNI_sayHello 是包含包名+类名+方法名
3. 我们需要使用Java的javac
命令编译TestJNI.java
文件,然后使用javah
命令生成C的头文件TestJNI.h
。然后我们使用C语言编译器编译Test.c
文件,并将其生成一个名为Test.dll
的库文件
javac TestJNI.java
javah -jni TestJNI
gcc -I "C:\Program Files\Java\jdk1.8.0_131\include" -I "C:\Program Files\Java\jdk1.8.0_131\include\win32" -shared -o Test.dll Test.c
注意: 如果java文件有包名,就在包根目录上运行命令,列如我的在 com.result.jni上
就需要再com上级目录上运行 javah -jni com.result.jni.TestJNI, 如果没有包名,那么可以放心运行
gcc指令 需要安装 ,已有忽略
链接【MinGW】一篇文章带你安装MinGW-w64(windows)_mingw64-CSDN博客
最后执行完,修改java程序的加载dll文件库地址,运行程序
Hello World!