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;

结论:标记解决方案

将标头中的未命名联合更改为命名联合,然后 JNAerate Java 代码,然后将标头更改回原来的样子。就像马克说的那样,它不会改变内存布局,所以你可以改变名字。

于 2010-03-25T12:29:09.600 回答
0

添加名称不会更改内存布局,因此您可以更改名称,JNAerate Java 代码(它将适当地映射内存/结构),然后撤消您的更改。JNA 将结构映射到您的实际库不会受到添加名称的影响。

编辑:您的结果有点奇怪,因为 JNAerator 文档清楚地解决了匿名类型问题,并且似乎表明它应该产生正确的结果。

于 2010-03-24T16:30:42.437 回答