2010-11-20 14 views
0

呼び出された関数によって割り当てられたメモリブロックから情報を取得することに問題があります。具体的には、JNAに付属するX11ライブラリに関数XGetWindowPropertiesがあります。最後のパラメータ-を介して結果を返します。JNA経由で配列を取得する

私は実際のメモリ領域がWindowの配列を含んでいることを知っています。しかし、どうすればそれらのオブジェクトを作成できますか?私はWindowのサイズを知らないので、ポインタ自体からそれを得る方法は見当たりませんし、Bufferを得ることができません。

実際の関数はint XGetWindowProperty(...., unsigned char **prop_return)で、これを呼び出すパラメータは実際にはint XGetWindowProperty(...., Window *prop_return[])です。

答えて

2

返されるデータ内の要素のサイズは、XGetWindowProperty()から返される "format"によって定義され、迷惑な例外が1つあります。 "long"が64ビットであっても、Xlibは常にフォーマット32を "long"の配列として返します。ウィンドウのフォーマットは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オブジェクトを構築できます。

です。これを自動的に処理するためにコンバーターを設定することは可能ですが、最終的には変換を明示的に行う方が簡単です。

関連する問題