暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java调用DLL库

BugProvider 2021-04-15
2038

Java调用DLL库

本文需解决的问题:

  1. JAVA如何调用DLL
  2. 项目打Jar包后如何能加载到外部的DLL

1.前提

  1. DLL文件分为32位 64位

    1. 如何查看DLL的位数
  2. 环境要求: 针对不同位数的DLL文件要使用对应位数JDK调用

    1. 言下之意: 32位DLL需32位JDK;64位DLL需64位JDK

    2. 如何查看JDK位数

1.1 如何查看DLL的位数

通过Visual Studio命令提示符中的dumpbin命令可以查看.net和非.net的dll的位数

dumpbin /headers C:/test.dll

在查询结果中,如果FILE HEADER VALUES中有32 bit word machine的值。表示dll是32位。

1.2 如何查看JDK的位数

Linux安装JDK

2.JAVA如何调用DLL

2.1添加Jna依赖

Maven:

<!-- Java Native Access -->
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.5.0</version>
</dependency>

2.2添加dll到SpringBoot中

  • 在resources中创建win32-x86-64文件夹

  • 将dll复制到resources/win32-x86-64中

  • 项目结构如下

2.3加载dll文件、编写dll接口

  • 继承com.sun.jna.Library
  • 使用com.sun.jna.Native.load(文件.dll,interface.class)
  • 根据dll文档编写对应的接口方法
  • 方法中Native.load会在resources/win32-x86-64加载对应文件
import com.sun.jna.Library;
import com.sun.jna.Native;

public interface TscLibDll extends Library {
    TscLibDll INSTANCE = Native.load("TSCLIB", TscLibDll.class);

    int about();

    int openport(String pirnterName);
}

  • C、JAVA数据类型对应关系

    Native TypeSizeJava TypeCommon Windows Types
    char8-bit integerbyteBYTE, TCHAR
    short16-bit integershortWORD
    wchar_t16/32-bit charactercharTCHAR
    int32-bit integerintDWORD
    intboolean valuebooleanBOOL
    long32/64-bit integerNativeLongLONG
    long long64-bit integerlong__int64
    float32-bit FPfloat
    double64-bit FPdouble
    char*C stringStringLPCSTR
    void*pointerPointerLPVOID, HANDLE, LPXXX
  • 使用接口调用方法

    TscLibDll.INSTANCE构建实例

    多个方法调用可执行多次INSTANCE

public String test(){
    TscLibDll.INSTANCE.openport("TSC TTP-246M Pro");
    TscLibDll.INSTANCE.sendcommand("REM ***** This is a test by JAVA. *****");
}

3.项目打Jar包后加载到外部的DLL

  • 打包项目
mvn clean package -Dmaven.test.skip=true

  • 在jar包的同目录下新建lib文件夹,将所有dll拷贝入lib中
  • 在jar包的同目录下新建start.bat文件,内容如下:
格式: start JDK路径-Djna.library.path=./lib -jar project.jar

案例: start E:/SDK/Java/JDK/bin/java -Djna.library.path=./lib -jar print-0.0.1-SNAPSHOT.jar
pause

执行start.bat进行测试

  • 文件夹结构
├─ target
│  ├─ print-0.0.1-SNAPSHOT.jar
│  ├─ lib
│     ├─ TSCLIB.dll
│  └─ start.bat

文章转载自BugProvider,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论