2014-10-24 4 views
2

나는 자바에서 사용할 수있는 DLL을 썼다. 예상대로 LIB로드되지만 DLL이 기능을 내보내는 것을 알 수 GetDllVersion에 대한 호출이잘못된 메모리 액세스

Exception in thread "main" java.lang.Error: Invalid memory access 
    at com.sun.jna.Native.invokeVoid(Native Method) 
    at com.sun.jna.Function.invoke(Function.java:367) 
    at com.sun.jna.Function.invoke(Function.java:315) 
    at com.sun.jna.Library$Handler.invoke(Library.java:212) 
    at com.sun.proxy.$Proxy0.GetDllVersion(Unknown Source) 
    at Main.main(Main.java:34) 

종속성 워커와 함께 실패합니다.

정확히 어떻게 함수 호출에 문제가 있는지 알아 보는 방법은 무엇입니까?

+0

어쩌면 GetDllVersion은 버퍼가 20 바이트를 초과 할 것으로 예상합니까? – Creris

+0

테스트 목적으로 GetDllVersion 메서드 본문의 모든 내용을 주석 처리했습니다. 그래서 실질적으로이 함수는 아무 것도하지 않습니다 – gorootde

+0

@k_wave - 그래서 DLL 함수를 디버깅하기 위해 디버거를 사용할 방법이 없습니까? DLL을 디버거를 사용하여 디버깅 할 수 있는지, 그리고 어떻게해야 하는지를 알아야합니다. – PaulMcKenzie

답변

2

내 문제점은 C 8 비트 문자 크기 대 자바 16 비트 문자의 크기 불일치이다. 한 가지 해결책은 데이터를 바이트 []로 전달하는 것입니다.

public void GetDllVersion(byte[] buffer, int bufferLen); 

__declspec(dllexport) void GetDllVersion(byte *buffer,int bufferLen) { 

또 다른 해결책은 기본 측면에 다양한 문자를 사용하는 것입니다.

__declspec(dllexport) void GetDllVersion(wchar_t *buffer,int bufferLen) {