Java调用C++动态库
1. 首先得到dll文件,把dll文件放在项目目录中;
2. 编写DllResultUtil:
1)初始化启动,dll文件路径
private static ICallCppDll callCppDll;
static{
callCppDll = (ICallCppDll)Native.loadLibrary("E:\\Practice\\PanoMongo\\src\\main\\resources\\config\\LeadorLicenseCheck.dll",ICallCppDll.class);
}
2)初始化Dllinit
注:String LicenseFile—--dll文件路径
byte[] SoftwareGuid—--软件授权码
byte[] inPutData----本机硬件序列号(cpu,硬盘等等)
int[] ClientNum----返回值参数
publicstaticint init(String LicenseFile, byte[] SoftwareGuid, byte[] inPutData, int[] ClientNum) {
inti = callCppDll.CheckDog(LicenseFile, SoftwareGuid, inPutData, ClientNum);
returni ;
}
3. 编写连接动态库方法
1)获取本机cpu序列号方法
longstart = System.currentTimeMillis();
Process process = Runtime.getRuntime().exec(
new String[] { "wmic", "cpu", "get", "ProcessorId" });
process.getOutputStream().close();
Scanner sc = new Scanner(process.getInputStream());
String property = sc.next();
String serial = sc.next();
2) 获取的32位Guid格式软件授权码
String r_strID ="9D1C1453-0810-4227-8C60-7878736F19F9";
3) 获取到cpu序列号后更改成32位
Stringm_strID = "9D1C145308104227BFEBFBFF000406E3";
4)由于C动态库要求授权码不需要“-”,且只能是16字节数组,所以把更改后的32位cpu序列号转译成16进制Byte[]
先编写方法
publicstaticbyte[] toBytes(String str) {
if(str == null || str.trim().equals("")) {
returnnewbyte[0];
}
byte[] bytes = newbyte[str.length() / 2];
for(inti = 0; i < str.length() / 2; i++) {
String subStr = str.substring(i * 2, i * 2 + 2);
bytes[i] = (byte) Integer.parseInt(subStr, 16);
}
returnbytes;
}
再调用
String s = "9D1C145308104227BFEBFBFF000406E3";
byte[] inPutData = toBytes (s);
String a = "9D1C1453081042278C607878736F19F9";
byte[] SoftwareGuid = toBytes(a);
5)最后在main方法中调用并实现运行传参,得到返回值
int [] ClientNum = new int[]{0};
inttem = DllResultUtil.init(LicenseFile,SoftwareGuid,inPutData, ClientNum);
System.out.println(tem);
如下为返回值对应参数:
case0:
strTemp = "验证通过";
break;
case -1:
strTemp = "出现未知异常,验证失败";
break;
case -2:
strTemp = "授权文件不存在或授权文件已损坏无法读取";
break;
case -3:
strTemp = "该授权文件不适用于本软件的授权";
break;
case -4:
strTemp = "传入参数不合法";
break;
case -5:
strTemp = "验证不通过";
break;
case -6:
strTemp = "授权时间过期";
break;
注意事项:
第一,方法很简单,最重要的在最后一步传参,若有一个参数不对,即返回为“-4”,这里主要是int ClientNum,这个C++里的int在java中是int[],而不是单纯的int,若这里不定义为int [] ClientNum = new int[]{0};前边所有的参数都对也还是返回“-4”;
第二,所有参数都对,结果执行后会返回“-6”,其实并不是授权时间过期,处理方法很简单,就是退出编译软件(eclipse),反键“以管理员身份运行”一次即可,后期再正常打开后皆可正常运行。