我有两个来源:
int
,short
,boolean
,enum
)和我还有一个用c编写的库,它能够使用这些c结构来执行特定的任务。
最后我有一个Java应用程序需要以某种方式使用这个库。
目前我从代表数据结构的xml文件生成Java类,现在我“just”需要以某种方式将它们提供给库。
我目前的方法是生成jni代码,从Java调用每个结构的c函数,接受Java生成的类作为参数。然后生成带有Java类的c代码并填写c-structs中的相应字段。
这是一个好方法吗?有人建议采用更简单的方法吗?
我正在考虑使用套接字,例如protobuf,但我认为这并不简单。
提前感谢任何建议。
答案 0 :(得分:1)
我最终使用的解决方案是使用Javolution struct library
基本上我正在生成从xml继承javolution.io.Struct
类的Java类,并正确地声明这些字段,以便javolution可以将其解释为struct。
这允许我做一个myJavaStructClass.getByteBuffer()
并获得一个directly mapped byte buffer,其内存布局与在c中声明的Java“struct”相同。因为它是直接映射的,所以包含一个可以通过JNI直接传递给本机代码的引用。
Javolution还支持打包和非打包结构,以及任意endianness。
答案 1 :(得分:0)
您不需要使用套接字从protobuf获取值。序列化为通过JNI在C和Java之间来回传递的直接字节缓冲区。这将更快,并导致编写较少恼人的代码。
根据评论,这仍然需要在你的结构和protobuf结构之间复制代码,但在我看来,一些CPP宏可以使这个非常简洁。您甚至可以创建一个代码生成器来处理一些protobuf数据结构;其他人也不是不可能的。