我在C中测试了这个EMV_Init(EMV_PARAMS * params,EMV_HANDLE * hEMV),效果很好。 现在我想通过jna在我的java应用程序中调用它。此函数位于windows(dll文件)下的本机库中。
EMV_PARAMS是一个结构
typedef struct
{
HAL_UI_HANDLE ui;
HAL_SCR_HANDLE card;
HAL_PROPERTY_HANDLE property;
HAL_DATE_HANDLE date;
HAL_CRYPTO_HANDLE crypto;
HAL_CHV_HANDLE chv;
} EMV_PARAMS;
请注意,EMV_PARAMS中的所有属性都是不透明的结构,如此typedef void * HAL_UI_HANDLE;
EMV_HANDLE也是一个不透明的结构:typedef void * EMV_HANDLE;
我需要你的帮助来解决以下错误:
Exception in thread "main" java.lang.NullPointerException at
com.sun.jna.Structure.getFields(Structure.java:895)
at com.sun.jna.Structure.deriveLayout(Structure.java:1042)
at com.sun.jna.Structure.calculateSize(Structure.java:966)
at com.sun.jna.Structure.calculateSize(Structure.java:933)
at com.sun.jna.Structure.allocateMemory(Structure.java:360)
at com.sun.jna.Structure.<init>(Structure.java:184)
at com.sun.jna.Structure.<init>(Structure.java:172)
at com.sun.jna.Structure.<init>(Structure.java:159)
at com.sun.jna.Structure.<init>(Structure.java:151)
我创建了一个名为&#34; CInterface&#34;的Java接口。其中包含&#34; EMV_PARAMS&#34;类。
public interface CInterface extends Library
{
CInterface INSTANCE = (CInterface) Native.loadLibrary("path to dll", CInterface.class);
public int EMVCT_Init(EMV_PARAMS.ByReference params, Pointer hEMV);
public static class PARAMS extends Structure
{
public static class ByReference extends PARAMS implements Structure.ByReference {}
Pointer ui;
Pointer card;
Pointer property;
Pointer date;
Pointer crypto;
Pointer chv;
@Override
protected List getFieldOrder() {
// TODO Auto-generated method stub
return null;
}
}
}
java测试类
public static void main(String[] args)
{
CInterface.EMV_PARAMS.ByReference emv_param = new
CInterface.EMV_PARAMS.ByReference();
int test= 0;
Pointer hEMV = null;
test=CInterfaceEMV.INSTANCE.EMVCT_Init(emv_param, hEMV);
System.out.println("test="+test);
}
感谢您的关注
答案 0 :(得分:0)
您的结构字段必须是公开的,您需要实施getFieldOrder()
。