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++数据类型 |
---|---|
boolean | bool |
byte | char |
short | short |
int | int |
long | long long |
float | float |
double | double |
String | const char* |
byte[] | char* |
short[] | short* |
int[] | bool |
boolean | int* |
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方法会自动给它赋值,然后转StringString regCode = new String(regCodeByte).trim();Map<String, Object> respMap = new HashMap<>();respMap.put("statusCode", statusCode);respMap.put("regCode", regCode);return respMap;}