有效地通过JNI传递大C结构

我有一个大的C结构(大约40个成员,int和char []),我必须通过JNI到Java端进行进一步处理。 这反复发生。 (我已经把GetMethodID()等放到了C端的init()函数中,所以我只需要调用它们一次。)

什么是有效的方法呢?

我能想到:

  1. 通过GetMethodID( ..., "", ... )使用适当的成员实例化Java类,并通过构造函数传递C结构的所有成员;
  2. 使用适当的成员分配Java结构,并通过SetXYZField()初始化(公共)成员;

我忽视了什么吗? (这是我与JNI的第一次“近战”。)是否真的没有有效的方法来“同步”C结构和Java结构?

什么是更有效的传递方法,1。或2.? 如果是1.,我应该通过CallXYZMethod() (参数列表)还是CallXYZMethodA() (参数数组)传递构造函数参数?

感谢您的输入。

编辑:稍微重写; 2.当然不需要是一个类,如果有一些其他解决方案来处理Java端的C数据,我并不需要Java方面的结构。

编辑2:我在C ++中这样做,但结构本身源于C-linkage回调函数,即没有C ++特定的问题。 改为阅读“C”而不是“C ++”。

为了提高效率,最好最大限度地减少通过JNI的调用,因此最好的办法是通过选项1发送所有数据并创建新对象。

如果你想避免为每次更新分配一个新对象,你也可以在Java端有一个“recieveUpdate(… 40 params …)”方法,尽管它的设计非常糟糕。

对不起,我没有时间写一个深思熟虑的答案,或者进一步研究这个问题,但不久前我不得不与JNI做了很多工作,我发现使用SWiG非常有帮助。 我不确定它的效率,但我想它会生成相当高效的代码。

无论如何,检查SWiG有一点关于通过值和主要结构 传递 结构 。

祝好运。