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

时间:2009-10-15 09:08:52

标签: java c java-native-interface

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

这样做的有效方法是什么?

我能想到:

  1. 通过GetMethodID( ..., "<init>", ... )使用适当的成员实例化Java类,并通过构造函数传递C结构的所有成员;
  2. 使用适当的成员分配Java结构,并通过SetXYZField()初始化(公共)成员;
  3. ...
  4. 我忽视了什么吗? (这是我与JNI的第一次“近战”。)是否真的没有“同步”C结构和Java结构的有效方法?

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

    感谢您的意见。

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

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

2 个答案:

答案 0 :(得分:1)

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

无论如何,请查看SWiG Passing structures by valueStructures上的{{3}}。

祝你好运。

答案 1 :(得分:1)

为了提高效率,最好尽量减少通过JNI的呼叫,因此最好的办法是通过选项1发送所有数据并创建新对象。

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