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

前言

在日常的开发中,对接外部接口常常有很多的对接方式,wsdl,rest,以及第三方提供的动态库等,本次将讲解在java中如何调用c开发的动态库。

1.c开发动态库dll

开发工具Clion,创建动态链接库。

1.1 新建项目dllDemo

project

1.2 选择C library 在选择shared

要选择shared,static是静态的
dynamic

1.3 项目的目录结构

包含头文件.h,和主要的代码.c文件,cmakelist.txt构建的脚本
目录结构

1.4 定义动态库函数

头文件定义两个动态库方法,hello以及add方法。

#ifndef DLLDEMO_LIBRARY_H
#define DLLDEMO_LIBRARY_H

void hello(void);

int add(int a,int b);

#endif //DLLDEMO_LIBRARY_H

在.c中写方法的具体实现。

#include "library.h"

#include <stdio.h>

void hello(void) {
    printf("调用动态库hello方法成功!\n");
}
//定义一个加法的方法
int add(int a,int b){
   int result = a+b;
    printf("调用动态库add方法:%d + %d=%d",a,b,result);
    return result;
}

1.5 导出动态库

简单动态库不需要在构建脚本中加入过多的代码,直接build project即可生成dll。
dll
到此为止动态库开发已经完毕,接下来就是开发java来调用dll。

2.java中使用jna调用dll

2.1 需要引入jna的依赖

        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>jna</artifactId>
            <version>5.10.0</version>
        </dependency>

2.2 加载动态库dll

jna提供了方法与c方法一一映射的方法,提供一个接口继承library即可。
代码如下:

public interface DllDemo extends Library {
    DllDemo instance = Native.load("libdlldemo.dll", DllDemo.class);
    void hello();
    int add(int a,int b);
}

这是jna 提供c与java数据类型的对应关系。
数据类型

2.3 测试程序

2.3.1 测试代码:

public class TestDllDemo {
    public static void main(String[] args) {
        DllDemo.instance.hello();
        int result = DllDemo.instance.add(2,4);
        System.out.println(result);
    }
}

调用错误

调用可以看到错误,Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
此错误是因为jdk的版本位数和动态 库的不一致导致的,两种解决方法:

  • 修改生成的dll的版本位数
  • 使用和dll版本匹配的jdk即可。

此处我直接修改jdk版本的位数。

2.3.2 测试结果输出

调用成功
到此为止 ,动态库的调用就结束啦。喜欢或者对你有帮助点个关注不迷路!