您的位置:首页 > Web前端

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

2016-10-27 18:08 295 查看
使用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("15626186595");

PointerByReference p1 = new PointerByReference();
p1.setValue(pointer);
PointerByReference p2 = new PointerByReference();
int r = TestDll1.INSTANCE.xEncrypt("15626186595", 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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息