步骤
创建一个包含本地方法的 Java 类
声明了一个名为printMessage
的本地方法,并在main
方法中尝试加载名为MyNativeLibrary
的本地库,然后调用本地方法。
public class NativeLibraryCaller {
public static native void printMessage();
public static void main(String[] args) {
try {
System.loadLibrary("MyNativeLibrary");
printMessage();
} catch (UnsatisfiedLinkError e) {
System.err.println("无法加载本地库:" + e.getMessage());
}
}
}
使用 Java 本地接口工具生成 C/C++ 头文件
使用javac <java文件>
去编译NativeLibraryCaller.java为NativeLibraryCaller.class。
在命令行中执行以下命令,假设 class类文件路径为E:/NativeLibraryCaller.class,
将生成一个名为NativeLibraryCaller.h
的头文件。
javah -jni NativeLibraryCaller
头文件为 C/C++ 代码提供了接口定义和规范,方便开发人员进行实现,同时支持跨平台开发,确保 Java 本地方法的正确实现和高效运行。
实现本地方法的 C/C++ 代码
新建文件NativeLibraryCaller.c(
C/C++ 源文件)并在其中实现本地方法,防止中文乱码打印的信息使用英文。
#include "NativeLibraryCaller.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativeLibraryCaller_printMessage(JNIEnv *env, jclass clazz) {
printf("the message is from MyNativeLibrary\n");
return;
}
编译 C/C++ 代码生成动态链接库(本地库)
如果电脑中没有安装了MinGW64(jdk是64位的情况下,如果是32位直接去官网下载安装MinGW),点击查看MinGW64安装教程。
如果MinGW64已经安装,执行以下命令生成MyNativeLibrary.dll文件,并把该文件放到java的bin目录下(也可以是其他java.library.path,可以使用java代码System.out.println(System.getProperty("java.library.path"))
查看,也可使用java -XshowSettings:properties命令查看,也可使用System.setProperty("java.library.path", "
MyNativeLibrary.dll所在文件夹")
直接指定)
gcc -shared -o MyNativeLibrary.dll NativeLibraryCaller.c -ID:\develop\java\include -ID:\develop\java\include\win32
其中-I用于指定include(也可通过环境变量指定),点击查看jdk中的include
使用class文件测试调用本地库接口
java NativeLibraryCaller
运行结果
流程
当运行 Java 程序时,JVM 会根据需要加载名为NativeLibrary
(在System.loadLibrary("NativeLibrary")
中指定)的本地库,并调用其中的本地方法。从文件上来说就是class文件调用的dll文件中的代码。
注意:实际使用中可能需要根据具体情况进行调整,并且确保本地库的路径能够被 JVM 正确找到。同时,使用 JNI 需要小心处理内存管理和错误处理等问题。
评论区