1

JNAerator を使用して、C 共有ライブラリから JNA を使用した Java コードを生成しようとしていますが、構造内にネストされた名前のない共用体の生成に失敗したことを除いて、すべて問題ありません。

例:

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

}MY_STRUCTURE;

ヘッダーを変更してユニオンに名前を付けると、機能します。しかし、明らかな理由から、使用しようとしている共有ライブラリを壊さずにヘッダーを変更することはできません。

ヘッダー ファイルと共有ライブラリを名前付きユニオンに変更する以外の解決策はありますか?

4

3 に答える 3

4

これは JNAerator のバグです。JNAerator プロジェクトのトラッカーに問題を登録しました。バグが修正されたときに通知を受け取りたい場合は、スターを付けることができます:

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

乾杯

Olivier (JNAerator の作者)

于 2010-04-14T17:51:58.723 に答える
1

さらに調査した結果、私の問題は匿名ユニオンではなく、名前のないユニオンの問題であると判断しました。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;

結論: Marks ソリューション

ヘッダーの名前のない共用体を名前付き共用体に変更し、Java コードを JNAerate してから、ヘッダーを元の状態に戻します。マークが言ったように、メモリレイアウトは変更されないので、名前を変更できます。

于 2010-03-25T12:29:09.600 に答える
0

名前を追加してもメモリ レイアウトは変更されないため、名前を変更し、Java コードを JNAerate (メモリ/構造を適切にマップします) してから、変更を元に戻すことができます。JNA による実際のライブラリへの構造のマッピングは、名前を追加しても影響を受けません。

編集: JNAerator のドキュメントは匿名型の問題に明確に対処しており、正しい結果を生成する必要があることを示しているように見えるため、結果は少し奇妙です。

于 2010-03-24T16:30:42.437 に答える