【问题标题】:JNA : Error when to call natives functions with pointer to struture as parametersJNA:使用指向结构的指针作为参数调用本机函数时出错
【发布时间】: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


【解决方案1】:

你的结构体字段必须是公开的,你需要实现getFieldOrder()

【讨论】:

  • 谢谢@technomage,当我实现 getFieldOrder() 方法时,这个问题似乎已经解决,但现在我得到了 Invalid memory access 错误,如果我不能解决它,我会发布它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2012-03-28
  • 2011-07-04
  • 2021-01-25
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多