Jnaerator Безымянный союз отсутствует в структуре

StackOverflow https://stackoverflow.com/questions/2503183

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Пример:

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

}MY_STRUCTURE;

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

Какие -нибудь решения, отличные от изменения файла заголовка и общей библиотеки на именованное Union?

Это было полезно?

Решение

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

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

Другие советы

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

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

Ваше здоровье

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

После дальнейших исследований я определил, что моя проблема является проблемой с неназванными профсоюзами, а не анонимными профсоюзами. 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;

Заключение: Решение Марка

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top