【发布时间】:2016-06-02 10:56:29
【问题描述】:
我在 C 中测试了这个 int 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)
我创建了一个名为“CInterface”的 Java 接口,其中包含“EMV_PARAMS”类。
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);
}
感谢您的关注
【问题讨论】:
-
您需要调整您的 IDE 设置,不仅可以发出函数存根,还可以发出它们的实现 :)
标签: data-structures jna