2010-11-20 32 views
0

J'ai un problème avec l'obtention d'informations à partir d'un bloc de mémoire alloué par la fonction appelée. Plus précisément, il y a la fonction XGetWindowProperties dans la librairie X11 incluse avec JNA. Il renvoie les résultats via le dernier paramètre - PointerByReference prop_return.Récupération d'un tableau via JNA

Je sais que la zone de mémoire réelle contient un tableau de Window. Mais comment puis-je créer ces objets? Je ne vois aucun moyen de l'obtenir à partir du pointeur lui-même et je ne peux pas obtenir un Buffer à partir de lui, puisque je ne connais pas la taille de Window. La vraie fonction est: int XGetWindowProperty(...., unsigned char **prop_return) et avec les paramètres que je l'appelle, c'est en fait int XGetWindowProperty(...., Window *prop_return[]).

Répondre

2

La taille des éléments dans les données renvoyées est définie par le "format" renvoyé par XGetWindowProperty(), avec une exception ennuyante. Xlib renvoie toujours le format 32 comme un tableau de "long" même si "long" est 64 bits. La fenêtre aurait le format 32.

Dans une recherche google rapide, vous pouvez utiliser NativeLong.SIZE pour déterminer cela dans JNA. Donc, si (NativeLong.SIZE == 8) vous avez un tampon d'ID de fenêtre 64 bits, sinon d'ID de fenêtre 32 bits.

L'ordre des octets de chaque valeur doit correspondre à l'unité centrale sur laquelle vous vous trouvez.

+0

Alors que cela résout mon problème immédiat, j'aimerais toujours voir une solution générale: comment passer de PointerByReference à un tableau de types mappés natifs connus. – viraptor

+1

ouais, je ne peux pas répondre à la question de la JNA, seulement la question Xlib. fwiw "Window" est juste un ID entier, ce n'est pas un objet dans un sens significatif. –

1

Vous devez d'abord extraire les données sous la forme d'un tableau de type primitif (int ou long selon le cas). Vous pouvez ensuite construire des objets X11.Window selon les besoins en utilisant les XID du tableau.

Il est possible de configurer des convertisseurs pour gérer une partie de cela automatiquement, mais finalement, il est plus simple pour un one-off de faire explicitement la conversion.