IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[JNA] Utilisation de structures anonymes


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 253
    Par défaut [JNA] Utilisation de structures anonymes
    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).

    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);
    }
    L'appel de la fonction HwdSessionOpenWithConfigPath provoque une exception : Unsupported return type class util.IHwdHdr$HwdSession in function _HwdSessionOpenWithConfigPath@4

    Avec ce code :
    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);
    }
    L'appel de la fonction HwdSessionOpenWithConfigPath provoque une exception : Structure class util.IHwdHdr$HwdSession has unknown size (ensure all fields are public)

    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à ?

  2. #2
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 253
    Par défaut
    Bon, j'ai trouvé la solution, c'est l'utilisation de PointerByReference.

    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 extends PointerByReference
    	{
    	}
     
    	HwdSession  HwdSessionOpenWithConfigPath(String astrConfigPath);
    }
    C'est tout simple, il faut juste trouver comment faire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'utilisation de structure en C++
    Par marcix dans le forum C++
    Réponses: 1
    Dernier message: 08/12/2007, 12h47
  2. Utilisation de structure personnelle.
    Par barbsbou dans le forum C
    Réponses: 10
    Dernier message: 08/10/2007, 01h08
  3. [XSLT] Comment utiliser une structure de type if-then-ELSE ?
    Par ribrok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/11/2006, 12h39
  4. [C#]Pourquoi utiliser une structure plutôt qu'une classe?
    Par egoom dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/10/2006, 09h49
  5. Débutant: Question sur l'utilisation des structures
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/10/2006, 13h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo