Bonjour à tous et à toutes.
1ère utilisation de JNA pour l'utilisation d'une librairie d'outils cartographique.
J'ai déclaré mes fonctions et commencé mon travail. Ça commence à tourner (enfin bon, j'arrive à appeler une méthode simple).
Sauf que .... La bibliothèque que j'utilise utilise des fonctions dont les paramètres passés ou en retour sont des pointeurs sur des structures définies comme (exemple) :
typedef struct _HwdFormatRec* HwdFormat;
De l'extérieur, en C, on ne manipule que des pointeurs sur des structures dont on ne connait pas la structure interne. C'est la librairie qui se débrouille avec.
En C ça arrive souvent. finalement ces pointeurs sont comme des 'int' sauf que le typage est fort, on DOIT passer un élément de ce type ou on reçoit un élément de ce type.
Pour toutes ces structures indéfinie, on les crés par une fonction Create (par exemple) puis on les détruits par une fonction Close ou Destroy (autre exemple).
L'appel de la fonction HwdSessionOpenWithConfigPath provoque une exception : Unsupported return type class util.IHwdHdr$HwdSession in function _HwdSessionOpenWithConfigPath@4
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public interface IHwdHdr extends Library { public static class HwdSession implements Structure.ByReference { } HwdSession HwdSessionOpenWithConfigPath(String astrConfigPath); }
Avec ce code :
L'appel de la fonction HwdSessionOpenWithConfigPath provoque une exception : Structure class util.IHwdHdr$HwdSession has unknown size (ensure all fields are public)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public interface IHwdHdr extends Library { public static class HwdSession extends Structure { @Override protected List getFieldOrder() { return new ArrayList(); } } HwdSession HwdSessionOpenWithConfigPath(String astrConfigPath); }
Comme structure il y a HwdSession, HwdFormat, HwdFormatVersion, HwdFileClass etc.
Si je remplace toutes ces structures simplement par un int ça va fonctionner, un pointeur en C est simplement un entier. Mais si je passe toute les fonctions qui prennent des structures en paramètre ou en retour par un int le code sera incompréhensible et le typage inexistant, on pourra ainsi passer à une fonction qui prend un HwdSession * comme paramètre un pointeur sur HwdFormat sans que le compilateur Java ne dise rien puisqu'il n'y aura plus de type, mais la DLL en C++ elle, elle ne va pas aimer du tout.
Je pense que ça doit être possible d'avoir des containers vide en indiquant à JNA, ça, ce type là, c'est un pointeur...
Enfin, j'espère que ça existe parce que sinon ça veut dire que ça doit bloquer pas mal de monde, on a pas toujours le contenu des structures que l'on manipule lorsqu'on attaque une librairie.
Vous avez une idée pour me sortir de là ?
Partager