Domanda

Sto cercando di ottenere JNAerator per generare un po 'di JNA sostenuta codice Java da una libreria C condivisa e tutto è bene, tranne che non è riuscito a generare un'unione senza nome nidificato all'interno di una struttura.

Esempio:

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

}MY_STRUCTURE;

Se cambio l'intestazione per rendere l'Unione ha un nome che funzionerà. Ma per ovvie ragioni non posso cambiare l'intestazione senza rompere la libreria condivisa che sto cercando di utilizzare.

Le eventuali soluzioni diverse cambiando il file di intestazione e libreria condivisa denominata unione?

È stato utile?

Soluzione

L'aggiunta di un nome non cambierà il layout di memoria, in modo da poter cambiare il nome, JNAerate il codice Java (che sarà mappare la memoria / struttura in modo appropriato) e quindi annullare la modifica. la mappatura della struttura alla tua biblioteca reale del JNA non sarà influenzato con l'aggiunta di un nome.

modifica : i risultati sono un po 'strano, dal momento che la documentazione JNAerator affronta chiaramente il anonima tipi problema e sembra indicare che dovrebbe di produrre i risultati corretti.

Altri suggerimenti

Questo è un bug nel JNAerator. Ho inserito un problema in inseguitore del progetto JNAerator, quindi se si desidera ricevere una notifica quando il bug è stato risolto si può recitare è:

http://code.google.com/p/jnaerator / temi / dettaglio? id = 60

Saluti

Olivier (autore di JNAerator)

Dopo ulteriori ricerche ho deciso che il mio problema è un problema con i sindacati senza nome sindacati non anonimi. JNAerator rivendica il supporto per le unioni anonime, ma non ho trovato nulla su unioni senza nome. Sulla base della mia esperienza direi che non supporta le unioni senza nome.

Nota a margine: i sindacati senza nome non sono supportati in serie C. Alcuni compilatori supportano, ma non più. È standard in C ++.

Anonimo Union:

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

}MY_STRUCTURE;

anonimo e Unione Senza nome:

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

}MY_STRUCTURE;

Conclusione: soluzione Marks

cambiare l'Unione senza nome nell'intestazione per un sindacato di nome poi JNAerate il codice Java e quindi modificare l'intestazione di nuovo a come era. Come Mark ha detto che non cambierà il layout di memoria, in modo da poter cambiare il nome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top