2013-06-24 1 views
1

뭔가 빠뜨린 것 같습니다. com.sun.jna.Callback을 구현하는 클래스의 인스턴스에서 함수 포인터 주소를 Pointer으로 가져와 Pointer을 사용하는 void* 매개 변수를 사용하는 함수로 전달할 수 있습니다.콜백을 JNA의 포인터로 바꿈

구체적으로, I는 만들려 CFNumber (일명 NSNumber*) I는 SpeechDoneProcPtr를 등록 SetSpeechProperty를 호출 할 수 있도록 함수의 주소를 사용 CFNumberCreate(Pointer, int, Pointer).

답변

1

그렇지 않습니다. 콜백 인스턴스를 전달하고 JNA가 포인터 변환을 처리하도록합니다. 콜백 객체에 대한 강력한 참조를 유지하여 GC가 수행되지 않도록하십시오.

필요한 경우 Pointer 대신 콜백 유형을 사용하는 다른 함수 매핑을 만듭니다.

native pointer value for a callback instance을 얻을 수 있지만 그럴 필요는 거의 없습니다.

+0

감사합니다. 처음에는 이상하게 느껴졌지만 콜백 매개 변수를 취하는 또 다른'CFNumberRef' 생성자는 잘 작동합니다 :'public CFNumberRef CFNumberCreate (포인터 할당, int 타입, 콜백 valuePtr);' – yonran

+0

사실 저는 [ 함수 포인터] (http://stackoverflow.com/a/17685620/471341). 'CallbackReference'는 public 클래스가 아니기 때문에 사용할 수 없습니다. 콜백을 포인터로 변환하는 공개 방법을 알고 있습니까? – yonran

+1

오, 그건 감시입니다. 당신은 효과적으로 하나의'Callback' 필드를 가진'Structure '를 생성함으로써 효과적으로'CallbackByReference'를 만들 수 있습니다. 동일한 메모리 레이아웃. – technomage

0

콜백을 포인터로 변환해야하고 더러운 해킹을 발견했습니다. 길이가 0 인 복사본으로 memcpy()를 호출하십시오. memcpy()는 콜백을 포인터로 반환합니다.

는 Windows의 나는 방어 적이기()가 발견되는 라이브러리 정의 :

public interface msvcrt extends StdCallLibrary { 
    Pointer memcpy(Callback dst, Callback src, int size); 
} 

을 그리고 다음과 같이 사용하기 :

public Pointer callbackToPointer(Callback callback) { 
    msvcrt crt = (msvcrt)Native.loadLibrary("msvcrt", msvcrt.class); 
    return crt.memcpy(callback, callback, 0); //zero length copy returns dest 
} 

타다을!