1.resources目录
把可执行的dll库放在resources目录下,会优先从该目录下加载文件
2.pom.xml
JNA(Java Native Access)是一个基于JNI技术的Java开源框架,提供工具类实现动态调用系统本地库的功能,开发者无需编写Native/JNI代码即可完成跨平台本地方法调用。通过创建继承自类的接口并加载动态链接库(DLL/SO),可声明并调用库中的方法。
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.15.0</version>
</dependency>
3.具体封装工具类
public class UseDllUtil {
public interface Dll extends Library {
public static Dll instance = (Dll) Native.loadLibrary("CryptoXLib", Dll.class);
public int Trans_Data_Protect(Pointer ucObjectType, int iDivisorLen, Pointer ucDivisorData, int iInLen, Pointer ucInData, Pointer ucExternData, IntByReference iOutLen, Pointer ucOutData, Pointer cErrTxt);
public int Trans_Data_SHA1(Pointer ucObjectType,int iInLen,Pointer ucInData,Pointer ucOutData,Pointer cErrTxt);
public int Trans_Data_BCDTOAN(int iInLen,Pointer ucInData,Pointer ucOutData,Pointer cErrTxt);
public int Trans_Data_ANTOBCD(int iKeyLen,Pointer pDataKey,Pointer pKey,Pointer cErrTxt);
public int Triple_DES_ECB(Pointer ucObjectType,Pointer ucIVData,int iDataLen,Pointer ucInData,int iLen,Pointer pKey,Pointer ucDecryptedData,Pointer cErrTxt);
}
public static String GetEncryptedCardNo(String bkCode, String bCode){
String bkCodeNew;
//卡号或者身份证号加密
Pointer ucObjectType=new Memory(4);
//ucObjectType.clear(4);
ucObjectType.setByte(0,new Byte("00"));
Pointer ucDivisorData=new Memory(1024);
ucDivisorData.setString(0,bCode);
Pointer ucInData=new Memory(1024);
ucInData.setString(0,bkCode);
Pointer ucExternData=new Memory(1024);
ucExternData.setString(0,"");
Pointer ucOutData=new Memory(1024);
ucOutData.setString(0,"");
Pointer cErrTxt=new Memory(1024);
cErrTxt.setString(0,"");
IntByReference iOutLen=new IntByReference();
iOutLen.setValue(0);
UseDllUtil.Dll.instance.Trans_Data_Protect(ucObjectType,bCode.length(),ucDivisorData,bkCode.length(),ucInData,ucExternData,iOutLen,ucOutData,cErrTxt);
bkCodeNew=ucOutData.getString(0);
System.out.println(bkCodeNew);
return bkCodeNew;
}
public static String decryptPassword(String bkCode, String bCode) {
String bkCodeNew;
//卡号或者身份证号加密
Pointer ucObjectType=new Memory(4);
//ucObjectType.clear(4);
ucObjectType.setByte(0,new Byte("01"));
Pointer ucDivisorData=new Memory(1024);
ucDivisorData.setString(0,bCode);
Pointer ucInData=new Memory(1024);
ucInData.setString(0,bkCode);
Pointer ucExternData=new Memory(1024);
ucExternData.setString(0,"");
Pointer ucOutData=new Memory(1024);
ucOutData.setString(0,"");
Pointer cErrTxt=new Memory(1024);
cErrTxt.setString(0,"");
IntByReference iOutLen=new IntByReference();
iOutLen.setValue(0);
UseDllUtil.Dll.instance.Trans_Data_Protect(ucObjectType,bCode.length(),ucDivisorData,bkCode.length(),ucInData,ucExternData,iOutLen,ucOutData,cErrTxt);
bkCodeNew=ucOutData.getString(0);
System.out.println(bkCodeNew);
return bkCodeNew;
}
}
将dll的调用与加解密方法直接封装起来调用