JNAerator безымянный союз отсутствует в структуре - PullRequest
1 голос
/ 23 марта 2010

Я пытаюсь заставить JNAerator сгенерировать некоторый Java-код, поддерживаемый JNA, из общей библиотеки C, и все в порядке, за исключением того, что ему не удалось сгенерировать безымянное объединение, вложенное в структуру.*

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

}MY_STRUCTURE;

Если я изменю заголовок, чтобы объединение имело имя, оно будет работать.Но по понятным причинам я не могу просто изменить заголовок, не нарушая разделяемую библиотеку, которую я пытаюсь использовать.

Какие-либо решения, кроме изменения файла заголовка и разделяемой библиотеки на именованное объединение?

Ответы [ 3 ]

4 голосов
/ 14 апреля 2010

Это ошибка в JNAerator. Я обнаружил проблему в трекере проекта JNAerator, поэтому, если вы хотите получать уведомления о том, что ошибка устранена, вы можете пометить ее:

http://code.google.com/p/jnaerator/issues/detail?id=60

Приветствия

Оливье (автор JNAerator)

1 голос
/ 25 марта 2010

После дополнительных исследований я определил, что моя проблема - проблема с неназванными профсоюзами, а не анонимными. JNAerator заявляет о поддержке анонимных союзов, но я ничего не нашел о неназванных союзах. Исходя из моего опыта, я бы сказал, что он не поддерживает безымянные союзы.

Примечание: Безымянные объединения не поддерживаются в стандартном C. Некоторые компиляторы поддерживают его, но не большинство. Это стандартно в C ++.

Анонимный Союз:

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

}MY_STRUCTURE;

Анонимный и Безымянный Союз:

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

}MY_STRUCTURE;

Вывод: отмечает решение

Измените безымянное объединение в заголовке на именованное объединение, затем JNAerate Java-код и затем измените заголовок обратно, как это было. Как сказал Марк, это не изменит расположение памяти, поэтому вы можете изменить имя.

0 голосов
/ 24 марта 2010

Добавление имени не изменит макет памяти, поэтому вы можете изменить имя, JNAerate Java-код (который будет соответствующим образом отображать память / структуру), а затем отменить ваши изменения. Отображение структуры JNA в вашей фактической библиотеке не повлияет на добавление имени.

edit : ваши результаты немного странные, поскольку документация JNAerator четко решает проблему анонимных типов и, кажется, указывает, что должно привести к правильному результаты.

...