java 调c写的dll 指针参数返回问题 char* PointerByReference创建 Pointer

本文介绍如何使用Java Native Access (JNA) 调用本地DLL文件,并提供了具体的加密解密函数调用示例代码。展示了如何通过JNA进行跨平台的32位与64位DLL调用,并解决内存堆溢出问题。

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

使用jna调用 jna已包含jnate

调用dll为64位的 不能调 32位的




public interface TestDll1 extends Library {
/**
* 当前路径是在项目下,而不是 bin 输出目录下。
*/
TestDll1 INSTANCE = (TestDll1) Native.loadLibrary("TestDll1",
TestDll1.class);


public void say(WString value);

//解密参数  输入 位数 输出指针 返回是否成功
public int xEncrypt(String input, int leninput, PointerByReference dest);


public int xEncrypt(PointerByReference input, int leninput,
PointerByReference dest);


public int xDecrypt(PointerByReference input, int leninput,
PointerByReference dest);
public int xDecrypt(String input, int leninput,
PointerByReference dest);
}


PointerByReference对应的c里的指针 char* 参数


创建方式


private static Pointer createPointer(String phone) {

Pointer p = new Memory(1024);

p.setWideString(0, phone);


return p;
}




加密调用


private static void encryPhone() {



//
// 加密
String encstr = "aaa";
Pointer pointer = createPointer("12312312312");


PointerByReference p1 = new PointerByReference();
p1.setValue(pointer);
PointerByReference p2 = new PointerByReference();
int r = TestDll1.INSTANCE.xEncrypt("12312312312", 11, p2);
System.out.println(p2.getValue());
for(int i = 0; i < p2.getPointer().SIZE; i ++){
System.out.println(p2.getPointer().getString(i));
}



}


PointerByReference 使用的pointer 

Pointer 创建由子类Memory创建 创建一定内存的空间




附件为jna 4.2.2的jar包




后期发现内存堆溢出严重

改为使用Memeroy做为指针



Memory memory = new Memory(11);
// PointerByReference p2 = new PointerByReference(pointer);
String res = null;
if (StringUtils.isBlank(res)) {
res = "-1";
}
int r2 = PhoneDllI.INSTANCE.xDecrypt(encryPhone, encryPhone.length(),
memory);







// 判断返回值是否为0 0为成功
if (r2 == 0) {
res = new String(memory.getByteArray(0, 11));
} else {
res = String.valueOf(r2);
}
memory.clear();
if(memory != null){
// System.out.println("in");
memory.clear();
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值