目 录CONTENT

文章目录
jvm

自定义jvm本地接口

半糖
2024-09-13 / 0 评论 / 0 点赞 / 11 阅读 / 4456 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-09-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

步骤

  1. 创建一个包含本地方法的 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());
        }
    }

}
  1. 使用 Java 本地接口工具生成 C/C++ 头文件

使用javac <java文件>去编译NativeLibraryCaller.java为NativeLibraryCaller.class。

在命令行中执行以下命令,假设 class类文件路径为E:/NativeLibraryCaller.class,将生成一个名为NativeLibraryCaller.h的头文件。

javah -jni NativeLibraryCaller

头文件为 C/C++ 代码提供了接口定义和规范,方便开发人员进行实现,同时支持跨平台开发,确保 Java 本地方法的正确实现和高效运行。

  1. 实现本地方法的 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;
}
  1. 编译 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

  1. 使用class文件测试调用本地库接口

java NativeLibraryCaller

运行结果

流程

当运行 Java 程序时,JVM 会根据需要加载名为NativeLibrary(在System.loadLibrary("NativeLibrary")中指定)的本地库,并调用其中的本地方法。从文件上来说就是class文件调用的dll文件中的代码。

注意:实际使用中可能需要根据具体情况进行调整,并且确保本地库的路径能够被 JVM 正确找到。同时,使用 JNI 需要小心处理内存管理和错误处理等问题。

0
jvm
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区