Question

Je suis en train de se JNAerator générer une JNA soutenu du code Java à partir d'une bibliothèque partagée C et tout va bien, sauf qu'il n'a pas réussi à générer une union sans nom imbriqué dans une structure.

Exemple:

typedef struct MY_STRUCTURE {
  union {
    My_Type1 var1;
    My_Type2 var2;
  };

}MY_STRUCTURE;

Si je change l'en-tête pour rendre le syndicat ont un nom, il fonctionnera. Mais pour des raisons évidentes, je ne peux pas simplement changer l'en-tête sans casser la bibliothèque partagée que je suis en train d'utiliser.

Toutes les solutions autres que la modification du fichier d'en-tête et d'une bibliothèque partagée à l'union du nom?

Était-ce utile?

La solution

Ajout d'un nom ne changera pas la mise en page de la mémoire, de sorte que vous pouvez changer le nom, JNAerate le code Java (qui tracera la mémoire / structure appropriée), puis annuler la modification. La cartographie de la JNA de la structure à votre bibliothèque réelle ne sera pas affectée par l'ajout d'un nom.

modifier : vos résultats sont un peu étrange, puisque la documentation JNAerator aborde clairement le problème des types anonymes et semble indiquer que devrait produire des résultats corrects.

Autres conseils

Ceci est un bogue dans JNAerator. Je suis entré un problème dans le suivi du projet JNAerator, donc si vous voulez être averti lorsque le bug est corrigé, vous pouvez activer le:

http://code.google.com/p/jnaerator / questions / détails? id = 60

Vive

Olivier (auteur de JNAerator)

Après plus de recherche je déterminé que mon problème est un problème avec les syndicats anonymes les syndicats ne sont pas anonymes. JNAerator réclame un soutien pour les syndicats anonymes, mais je n'ai pas trouvé quoi que ce soit sur les syndicats anonymes. Sur la base de mon expérience, je dirais qu'il ne supporte pas les syndicats anonymes.

Note de côté: les syndicats ne sont pas pris en charge sans nom dans la norme C. Certains compilateurs prennent en charge mais pas plus. Il est standard en C ++.

Union Anonyme:

typedef struct MY_STRUCTURE {
  int i;
  char c; 
  union { 
    My_Type1 var1; 
    My_Type2 var2; 
  }UnionName; 

}MY_STRUCTURE;

Anonyme et Union Sans nom:

typedef struct MY_STRUCTURE { 
  int i;
  char c;
  union { 
    My_Type1 var1; 
    My_Type2 var2; 
  }; 

}MY_STRUCTURE;

Conclusion: solution Marques

Changer l'union sans nom dans l'en-tête d'un syndicat nommé alors JNAerate le code Java, puis changer l'en-tête à la façon dont il était. Comme Mark a dit qu'il ne changera pas la mise en page de la mémoire, de sorte que vous pouvez changer le nom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top