Java调用DLL库
本文需解决的问题:
JAVA如何调用DLL 项目打Jar包后如何能加载到外部的DLL
1.前提
DLL文件分为32位 64位
如何查看DLL的位数 环境要求: 针对不同位数的DLL文件要使用对应位数JDK调用
言下之意: 32位DLL需32位JDK;64位DLL需64位JDK
如何查看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的位数
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 Type Size Java Type Common Windows Types char 8-bit integer byte BYTE, TCHAR short 16-bit integer short WORD wchar_t 16/32-bit character char TCHAR int 32-bit integer int DWORD int boolean value boolean BOOL long 32/64-bit integer NativeLong LONG long long 64-bit integer long __int64 float 32-bit FP float double 64-bit FP double char* C string String LPCSTR void* pointer Pointer LPVOID, 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




