java调用C语言的dll方法

0 前言

同事用C语言写了几个方法,封装成dll文件,要用java去调用dll里的方法

1 dll方法说明

在这里插入图片描述

2 将dll文件放到指定目录下

如:C:\soft\project\encrypt\encryptDll\DllEnCry.dll

3 pom文件

引入以下两个依赖:

<dependency>
	<groupId>net.java.dev.jna</groupId>
	<artifactId>jna</artifactId>
	<version>5.13.0</version>
</dependency>
<dependency>
	<groupId>net.java.dev.jna</groupId>
	<artifactId>jna-platform</artifactId>
	<version>5.12.1</version>
</dependency>

4 工具类

public interface EncryptDllUtils extends Library {

    EncryptDllUtils instance = Native.load("C:\\soft\\project\\encrypt\\encryptDll\\DllEnCry.dll", EncryptDllUtils.class);
    int GetRegisterCode(String machcode, byte[] regcode, String softIDList, int[] mode, String time);
}

注意点:
① load()方法里好像只能传绝对路径,相对路径会识别不到
② 方法名和dll的方法名保持一致
③ 出参和入参中字段名和dll中的字段名保持一致,字段类型需要对应上,java和C语言的字段类型参考以下:

Java数据类型C/C++数据类型
booleanbool
bytechar
shortshort
intint
longlong long
floatfloat
doubledouble
Stringconst char*
byte[]char*
short[]short*
int[]bool
booleanint*
long[]long*
float[]float*
double[]double*

5 调用

方法中的byte[] regcode是dll返回参数,需要提前把**byte[]**传进去,dll会自动赋值应该是

public static Map<String, Object>  generate(String machCode, String softIDList, int[] modes, String time) {
    byte[] regCodeByte = new byte[5000];
    int statusCode = EncryptDllUtils.instance.GetRegisterCode(machCode, regCodeByte, softIDList, modes, time);
    // regCodeByte在调用万dll中的方法后,dll方法会自动给它赋值,然后转String
    String regCode = new String(regCodeByte).trim();
    Map<String, Object> respMap = new HashMap<>();
    respMap.put("statusCode", statusCode);
    respMap.put("regCode", regCode);
    return respMap;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值