package com.srcb.topcard.jna;
import java.util.ArrayList;
import java.util.List;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
/**
* JNA框架DLL动态库读取调用示例类
* @ClassName: DllCall
* @Description: 读取调用DLL动态库文件中的方法
*/
public class JNADllCallInfo {
/**
* DLL动态库调用方法
* @Description: 读取调用CDecl方式导出的DLL动态库方法
*/
public interface CLibrary extends Library {
//"C:\\Users\\pc\\Desktop\\jna\\genICData"
@SuppressWarnings("deprecation")
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(System.getProperty("user.dir")+"\\dll\\genICData",
CLibrary.class);
// 声明将要调用的DLL中的方法,可以是多个方法(此处示例调用本地动态库genICData.dll中的genICData()方法)
int genICData(String key_cfg, String card_no, String card_seq, String atc, String txn_date, String txn_amt, Pointer out_ic_data, IntByReference out_ic_data_len);
}
public static int getData(String key_cfg,String card_no,String card_seq,String atc
,String txn_date,String txn_amt,Pointer out_ic_data,IntByReference out_ic_data_len){
return CLibrary.INSTANCE.genICData(key_cfg, card_no, card_seq, atc, txn_date, txn_amt, out_ic_data, out_ic_data_len);
}
public static void main(String[] args) {
getData();
}
private static void getData() {
System.gc();
String key_cfg=System.getProperty("user.dir")+"\\src\\keymsg.cfg";
String card_no="6230351800362952";
String card_seq="01";
String atc = "102";
String txn_date="20310305";
String txn_amt="000000010000";
Pointer out_ic_data = new Memory(1024*1024);
IntByReference out_ic_data_len=new IntByReference();
int str = getData(key_cfg,card_no,card_seq,atc,txn_date,txn_amt,out_ic_data,out_ic_data_len);
System.out.println("*************"+str);
int len = out_ic_data_len.getValue();
System.out.println("*************len:"+len);
byte[] bt = out_ic_data.getByteArray(0, 1024*1024);
System.out.println("*************out_ic_data:"+new String(bt).trim());
long peer = Pointer.nativeValue(out_ic_data);
Native.free(peer);//手动释放内存
Pointer.nativeValue(out_ic_data, 0);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}