Java调用C++动态库

本文详细介绍了如何在Java中调用C++动态库,包括将dll文件放置于项目目录、使用Native.loadLibrary加载、创建接口并初始化、获取本机CPU序列号、转换16进制Byte数组,以及处理各种返回值的情况。特别指出,参数传递的正确性和以管理员身份运行的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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[] inPutDataint[] 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),反键“以管理员身份运行”一次即可,后期再正常打开后皆可正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值