Java类到c结构

时间:2011-07-04 12:12:06

标签: java c data-structures java-native-interface

我有两个来源:

  • 包含数百个数据结构定义的xml文件,基本上是包含简单数据类型的字段的结构(例如intshortbooleanenum)和
  • 包含相同数据结构的c头文件表示c结构。 (我无法修改此头文件或c结构。)

我还有一个用c编写的库,它能够使用这些c结构来执行特定的任务。

最后我有一个Java应用程序需要以某种方式使用这个库。

目前我从代表数据结构的xml文件生成Java类,现在我“just”需要以某种方式将它们提供给库。

我目前的方法是生成jni代码,从Java调用每个结构的c函数,接受Java生成的类作为参数。然后生成带有Java类的c代码并填写c-structs中的相应字段。

这是一个好方法吗?有人建议采用更简单的方法吗?

我正在考虑使用套接字,例如protobuf,但我认为这并不简单。

提前感谢任何建议。

2 个答案:

答案 0 :(得分:1)

我最终使用的解决方案是使用Javolution struct library

基本上我正在生成从xml继承javolution.io.Struct类的Java类,并正确地声明这些字段,以便javolution可以将其解释为struct。

这允许我做一个myJavaStructClass.getByteBuffer()并获得一个directly mapped byte buffer,其内存布局与在c中声明的Java“struct”相同。因为它是直接映射的,所以包含一个可以通过JNI直接传递给本机代码的引用。

Javolution还支持打包和非打包结构,以及任意endianness

另一种解决方案是使用SWIG直接从c头文件生成Java类,并通过JNI直接在本机代码中管理它们。

答案 1 :(得分:0)

您不需要使用套接字从protobuf获取值。序列化为通过JNI在C和Java之间来回传递的直接字节缓冲区。这将更快,并导致编写较少恼人的代码。

根据评论,这仍然需要在你的结构和protobuf结构之间复制代码,但在我看来,一些CPP宏可以使这个非常简洁。您甚至可以创建一个代码生成器来处理一些protobuf数据结构;其他人也不是不可能的。