2014-03-07 7 views
1

Windows 64 비트/Eclipse Keplex (Java 6)에서 JNA를 사용하고 있습니다.JNA and Eclipse

내 프로그램이 예상대로 이클립스에서 디버깅 할 때 나는 함수 중 하나를 호출 할 때, 코드의 동일한 부분은 항상 예외를 발생 작동하지만 :

java.lang.Error: Invalid memory access 
    at com.sun.jna.Native.invokeInt(Native Method) 
    at com.sun.jna.Function.invoke(Function.java:344) 
    at com.sun.jna.Function.invoke(Function.java:276) 
    at com.sun.jna.Library$Handler.invoke(Library.java:216) 

을 내가 설정을 jna.library.path 변수를했는데 DLL이 올바르게 발견되고 매핑되었습니다 ...

다시 말하면, 제가 Eclipse 외부에서 똑같은 프로그램을 실행해도 전혀 문제가 없습니다. 최대한 빨리 중 하나 부르는

library = (FKCOMM) Native.loadLibrary("FKCOMM", FKCOMM.class); 

그리고 :

public interface FKCOMM extends StdCallLibrary { 
public final static int FK_COMM_MAX_STAT_CODES    = 100; 
public final static int STIL_MD5_KEY_LEN     = 36; 

int FofInit(String host, String service, int openNow, LpFof pSrvFof); 
int FofClose(Fof srvFof); 
Fof FofLast(); 
int FofClear(Fof srvFof); 
int FofExecGetOrigins(Fof srvFof); 

int FofExecFml(Fof serv, String appcode, String usercode, String format, String inout, String type, 
       String reference, String sender, String receiver, String amount, String currency, 
       String currency2, String unit, String userdata, String service, String mur, 
       String vflag, String message, int details); 
int FofExec(Fof srvFof, int mode, String field, String icn, String mtype, String unit, int details); 
int FofExecFmlSimple(Fof serv, String appCode, String userCode, String mode, String unit, String userData, String message, int details); 
int FofExecFmt(Fof serv, int i, String c1, String c2, String c3, String c4, String c5, String c6, int i2); 

int FniExecBuildBuffer(Fni srvFni, Fof srvFof, String text, char ioIndicator, String businessType, 
     String messageId, String messageType, String format, String amount, String currency, String senderReference, 
     String entity, String appCode, int detailAlertP, PointerByReference pBuffer, PointerByReference pLen, 
     String sender, String receiver, String addInfo, String itvTxt); 

int FofExecGetRecord(Fof serv, String recordId); 
int FkCommTraceOn(String path, String name, int LogicalMode); 
int FofSetCaller(Fof serv, String caller); 
int FofExecSrvReady(Fof serv); 

}

이 방법을로드, 두 환경에서 작동 : 여기

는 라이브러리의 인터페이스입니다 방법 :

result = library.FofExecFmt(session, 1, settings.getFormatName(), data, "", settings.getApplicationId(), request.getId(), "", request.isWithDetails() ? 1 : 0); 

예외가 발생합니다 (생산 중이 아닌 Eclipse에서만) ...

답변

1

Eclipse의 JRE의 네이티브 라이브러리 위치에 JNA lib 디렉토리를 추가하십시오.

    Eclipse 프로젝트에
  1. 오른쪽 클릭 -> 경로를 빌드 -> 구성 경로 구축
  2. 열기 JRE 시스템 라이브러리
  3. 기본 lib 디렉토리 위치에
  4. 클릭
  5. 편집
  6. 선택 JNA 라이브러리 위치