Jnaerator Union sem nome, faltando na estrutura
Pergunta
Estou tentando fazer com que o JNAerator gerasse algum código JAVA apoiado pela JNA de uma biblioteca compartilhada C e tudo está bem, exceto que não conseguiu gerar uma união sem nome aninhada dentro de uma estrutura.
Exemplo:
typedef struct MY_STRUCTURE {
union {
My_Type1 var1;
My_Type2 var2;
};
}MY_STRUCTURE;
Se eu mudar o cabeçalho para fazer o sindicato ter um nome, ele funcionará. Mas, por razões óbvias, não posso simplesmente mudar o cabeçalho sem quebrar a biblioteca compartilhada que estou tentando usar.
Alguma soluções além de alterar o arquivo de cabeçalho e a biblioteca compartilhada para a Union nomeada?
Solução
A adição de um nome não altera o layout da memória, para que você possa alterar o nome, JNAERET o código Java (que mapeará a memória/estrutura adequadamente) e, em seguida, desfazer sua alteração. O mapeamento da estrutura da JNA na sua biblioteca real não será impactado adicionando um nome.
editar: Seus resultados são um pouco estranhos, já que a documentação do jnaerator aborda claramente o Problema de tipos anônimos e parece indicar que isso deve produzir os resultados corretos.
Outras dicas
Este é um bug no jnaerator. Entrei em um problema no rastreador do JNAerator Project; portanto, se você quiser ser notificado quando o bug é corrigido, pode estrelar:
http://code.google.com/p/jnaerator/issues/detail?id=60
Felicidades
Olivier (autor de Jnaerator)
Depois de mais pesquisas, determinei que meu problema é um problema com sindicatos sem nome, não sindicatos anônimos. O JNAerator reivindica apoio para sindicatos anônimos, mas não encontrei nada sobre sindicatos sem nome. Com base na minha experiência, eu diria que não suporta sindicatos sem nome.
Nota lateral: os sindicatos não identificados não são suportados no padrão C. Alguns compiladores suportam, mas não a maioria. É padrão em C ++.
União Anônima:
typedef struct MY_STRUCTURE {
int i;
char c;
union {
My_Type1 var1;
My_Type2 var2;
}UnionName;
}MY_STRUCTURE;
União anônima e sem nome:
typedef struct MY_STRUCTURE {
int i;
char c;
union {
My_Type1 var1;
My_Type2 var2;
};
}MY_STRUCTURE;
CONCLUSÃO: Solução de marcas
Mude a união sem nome no cabeçalho para um sindicato nomeado, em seguida, jogue o código Java e depois altere o cabeçalho de volta para como era. Como Mark disse que não mudará o layout da memória, para que você possa alterar o nome.