JNA:使用指向struture的指针作为参数调用本机函数时出错

时间:2016-06-02 10:56:30

标签: data-structures jna

我在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);

}

感谢您的关注

1 个答案:

答案 0 :(得分:0)

您的结构字段必须是公开的,您需要实施getFieldOrder()