有效地通过JNI传递大C结构
我有一个大的C结构(大约40个成员,int和char []),我必须通过JNI到Java端进行进一步处理。 这反复发生。 (我已经把GetMethodID()
等放到了C端的init()
函数中,所以我只需要调用它们一次。)
什么是有效的方法呢?
我能想到:
- 通过
GetMethodID( ..., "", ... )
使用适当的成员实例化Java类,并通过构造函数传递C结构的所有成员; - 使用适当的成员分配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有一点关于通过值和主要结构 传递 结构 。
祝好运。