java中使用JNA调用C/C++动态链接库中的函数

发布时间 2023-09-17 18:20:32作者: 黄河大道东

C++部分

创建动态库项目

image

image

注意:动态库中的头文件,必须要将需要导出的函数包裹在extern "C" {}中,否者在使用侧java工程中,就无法加载并使用

JAVA部分

pom依赖

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.18</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.0.9</version>
    </dependency> 
</dependencies>

工程结构

image

将C++项目编译出的动态链接库复制到java项目的resources目录下以供jna库加载并使用

测试类

import cn.hutool.core.io.FileUtil;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface DllDemo extends Library {

    // 绝对路径方式加载
    // DllDemo instance = (DllDemo) Native.loadLibrary("D:\\code\\test\\myTestNett\\src\\main\\resources\\libdlldemo.dll", DllDemo.class);
    // 类路径方式加载
    DllDemo INSTANCE = (DllDemo) Native.loadLibrary(FileUtil.getAbsolutePath("libdlldemo.dll"), DllDemo.class);
	// 方法映射1
    void hello();
	// 方法映射2
    int add(int a, int b);

    // 测试
    public static void main(String[] args) {
        DllDemo.INSTANCE.hello();  
        int res = DllDemo.INSTANCE.add(1, 2);
        System.out.println(res);
    }
}

jna 提供C与JAVA数据类型映射

image

参考

Java使用jna调用c开发的动态库dll文件

在Windows上使用CMake编译64位dll