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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top