使用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();
}