在java中读取C静态结构
我在c文件中有一个静态结构,如下所示:在java中读取C静态结构,java,c,data-structures,Java,C,Data Structures,我在c文件中有一个静态结构,如下所示: static struct my_structure[] = { { TE , -1, TEST, 0, 0, 0 }, { RT , 1, 0, 0, 0, MSG( 670, "Test") }, { RT , 2, 25, 0, 0, MSG(8187, "Test2"), MSG(1215, "Test3") }} 可以直接从java加载结构吗?或者,读
static struct my_structure[] = {
{ TE , -1, TEST, 0, 0, 0 },
{ RT , 1, 0, 0, 0, MSG( 670, "Test") },
{ RT , 2, 25, 0, 0, MSG(8187, "Test2"), MSG(1215, "Test3") }}
可以直接从java加载结构吗?或者,读取java对象中的信息的最佳方法是什么
当然,我可以解析文件,但我想知道是否有更好的方法来实现这一点。虽然您可以使用诸如与C代码轻松交互之类的工具,但也有一些限制。一是需要在Java中声明
my_structure
的结构(JNA不解析C代码,它解析描述C代码和结构的Java代码)。这意味着您必须始终保持两者同步
更糟糕的是,不同的C编译器在结构中有不同的默认值(许多编译器甚至有更改这些默认值的选项)。因此,编译器和/或编译器选项的更改可能会破坏这一脆弱的链接
这就是为什么我建议您编写一些C代码,将内部结构转储到Java可以解析的文件中。为了让事情变得更简单,你可以使用一个或谷歌的
或者在两端以相同的方式解决问题,并将静态结构导出到一个文件中,然后在运行时由C和Java代码解析。虽然您可以使用类似工具轻松地与C代码交互,但也有一些限制。一是需要在Java中声明
my_structure
的结构(JNA不解析C代码,它解析描述C代码和结构的Java代码)。这意味着您必须始终保持两者同步
更糟糕的是,不同的C编译器在结构中有不同的默认值(许多编译器甚至有更改这些默认值的选项)。因此,编译器和/或编译器选项的更改可能会破坏这一脆弱的链接
这就是为什么我建议您编写一些C代码,将内部结构转储到Java可以解析的文件中。为了让事情变得更简单,你可以使用一个或谷歌的
或者在两端以相同的方式解决问题,并将静态结构导出到一个文件中,然后在运行时由C和Java代码进行解析
TEST
和MSG()
很可能是宏)。不,当然(?)不可能“直接”加载它,您拥有的是C源代码
您将不得不解析代码以了解它的“含义”,特别是因为它似乎也在使用C预处理器宏(
TEST
和MSG()
很可能是宏).您也可以尝试Java,并以其格式描述结构,只需解析并重新映射数据块,从C到Java您也可以尝试Java,并以其格式描述结构,只需解析并重新映射数据块,从C到JavaJSON的想法很好,但硬连接文本替换可能不起作用,因为OP正在使用宏。您需要用C编写一个小助手程序,它使用结构并将其内容作为JSON打印到标准输出。然后,您可以调用此程序并使用管道从java应用程序中读取它。@UniversE非常感谢!:-)JSON的想法很好,但是硬连接文本替换可能不起作用,因为OP使用的是宏。您需要用C编写一个小助手程序,它使用结构并将其内容作为JSON打印到标准输出。然后,您可以调用此程序并使用管道从java应用程序中读取它。@UniversE非常感谢!:-)让我们把测试和消息放在一边。这可以保存在字符串中,我可以解析它。从MSG(1215,“Test3”)中,我只需要“Test3”。让我们把测试和MSG放在一边。这可以保存在字符串中,我可以解析它。从MSG(1215,“Test3”)中,我只需要“Test3”。呃,这是有效的C代码吗?实际的结构类型定义在哪里?呃,那是有效的C代码吗?实际的结构类型定义在哪里?