2010-11-20 6 views
0

호출 된 함수에서 할당 한 메모리 블록에서 정보를 다시 가져 오는 데 문제가 있습니다. 특히, JNA에 포함 된 X11 lib에 함수 XGetWindowProperties이 있습니다. 마지막 파라미터 인 PointerByReference prop_return을 통해 결과를 반환합니다.JNA를 통해 배열 검색 중

실제 메모리 영역에는 Window의 배열이 들어 있습니다. 그러나 어떻게 그 객체를 만들 수 있습니까? 포인터 자체에서 얻는 방법이 보이지 않으며 Window 크기를 모르기 때문에 Buffer을 얻을 수 없습니다.

실제 함수는 int XGetWindowProperty(...., unsigned char **prop_return)이고 매개 변수는이 매개 변수가 실제로는 int XGetWindowProperty(...., Window *prop_return[])입니다.

답변

2

반환 된 데이터의 요소 크기는 XGetWindowProperty()에서 반환 된 "형식"에 의해 정의되며 하나의 성가신 예외가 있습니다. Xlib은 "long"이 64 비트 인 경우에도 항상 "long"배열로 32 형식을 반환합니다. 윈도우의 형식은 32입니다.

빠른 Google 검색에서 NativeLong.SIZE를 사용하여 JNA에서이를 확인할 수 있습니다. 그래서 (NativeLong.SIZE == 8) 64 비트 창 ID 버퍼가 있고 그렇지 않은 경우 32 비트 창 ID 버퍼가 있습니다.

각 값의 바이트 순서는 현재 사용중인 CPU와 일치해야합니다.

+0

이것이 나의 즉각적인 문제를 해결하는 동안, 나는 일반적인 해결책을보고 싶다 : PointerByReference에서 알려진 네이티브 매핑 타입의 배열로가는 방법. – viraptor

+1

예, JNA 질문에만 대답 할 수는 없지만 Xlib 질문 만 답변 할 수 있습니다. fwiw "Window"는 단지 정수 ID이며 의미있는 의미의 객체는 아닙니다. –

1

데이터를 먼저 원시 유형 (int 또는 long으로 적절하게 배열)으로 추출해야합니다. 그런 다음 배열의 XID를 사용하여 필요에 따라 X11.Window 객체를 생성 할 수 있습니다.

입니다.이 중 일부는 자동으로 처리하기 위해 변환기를 설정할 수 있지만 궁극적으로 전환을 명시 적으로 수행하는 것이 더 간단합니다.