2012-12-29 1 views
2
I 타사 DLL

JNA 상당 *

__declspec(dllimport) Init(DWORD id,HANDLE* handle); 

JNAerate 정의 AC 기능을 사용해야

는 .... 상기 메소드 서명은 다음 생성하는 일종의 충분

public static native int Init(int id,PointerByReference handle); 

그리고 그것을 사용하여

public interface Dll extends Library 
{ 
    public Dll _dll = (Dll)Native.LoadLibrary("dll_name"); 
    public int Init(int id,PointerByReference handle); 
} 

public void init() 
{ 
    long hwnd = 0; 
    LongByReference lbr = new LongByRefrence(hwnd); 
    PointerByReference pbr = new PointerByReference(); 
    pbr.setPointer(lbr.getPointer()); 
    int ret = _dll.init(0x01,pbr); 
} 

하지만 이것은 JVM을 충돌 ... 누군가가 내게 JNA에서 void **를 매핑하는 적절한 방법을 말해 줄 수 있습니까?

답변

0

PointerByReference.getValue()은 수신자가 "returned"값을 제공합니다. 이것이 HANDLE 값을 초기화하는 데 사용할 수있는 값입니다. PointerByReference을 "초기화"할 필요가 없습니다.

public void init() 
{ 
    PointerByReference pbr = new PointerByReference(); 
    int ret = _dll.init(0x01,pbr); 
    HANDLE handle = new HANDLE(pbr.getValue()); 
} 
+0

나는 그랬지만 여전히 같은 결과를 보았습니다. JVM에서 EXCEPTION_ACCESS_VIOLATION (0xc0000005)을 말하는 것으로 충돌합니다. –

+0

'pbr.getValue()'가 null입니까? '_dll.init()'가 유효하지 않은 값을 반환한다면 확실히 사용해서는 안됩니다. – technomage

+0

jvm이'_dll.init()'라인 자체에서 충돌합니다 ... 지금은 JNI를 사용하여이 DLL을 사용하고 완벽하게 작동합니다 ... 아마 JNA에게 다른 시간을 주려고합니다. –