Jnaerator Безымянный союз отсутствует в структуре
Вопрос
Я пытаюсь заставить 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, а затем измените заголовок на то, как он был. Как сказал Марк, это не изменит макет памяти, поэтому вы можете изменить имя.