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;
}
}
}
자바 테스트 클래스는 관심
함수 스텁을 방출 할뿐만 아니라 해당 구현을 구현하도록 IDE 설정을 조정해야합니다. – technomage