2016-06-02 9 views
0

C에서이 int EMV_Init (EMV_PARAMS * params, EMV_HANDLE * hEMV)를 테스트 한 결과 제대로 작동합니다. 이제 jna를 사용하여 Java 응용 프로그램에서 호출하려고합니다. 이 함수는 Windows (dll 파일)의 기본 라이브러리에 있습니다.JNA : struture 포인터를 매개 변수로 사용하여 원어민 함수를 호출 할 때 오류가 발생했습니다.

EMV_PARAMS 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; 

이 주 형식 정의하기 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) 

나는 "EMV_PARAMS"클래스를 포함 "CInterface"라는 이름의 자바 인터페이스를 만들었습니다.

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

} 

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; 
     } 

    } 

} 

자바 테스트 클래스는 관심

+0

함수 스텁을 방출 할뿐만 아니라 해당 구현을 구현하도록 IDE 설정을 조정해야합니다. – technomage

답변

0

귀하의 구조 필드를 공개해야 주셔서 감사합니다, 당신은 getFieldOrder()를 구현해야합니다.

+0

@technomage에 감사드립니다.이 문제는 getFieldOrder() 메소드를 구현할 때 수정 된 것으로 보이지만 지금은 잘못된 메모리 액세스 오류가 발생했습니다. 내가 그것을 해결할 수 없다면 게시 할 것이다. – Bace