我有一个大的C结构(大约40个成员,int和char []),我必须通过JNI到Java端进行进一步处理。这反复发生。 (我已将GetMethodID()
等放入C侧的init()
函数中,因此我只需要调用它们一次。)
这样做的有效方法是什么?
我能想到:
GetMethodID( ..., "<init>", ... )
使用适当的成员实例化Java类,并通过构造函数传递C结构的所有成员; SetXYZField()
初始化(公共)成员; 我忽视了什么吗? (这是我与JNI的第一次“近战”。)是否真的没有“同步”C结构和Java结构的有效方法?
什么是更有效的传递方法,1。或2.?如果是1.,我应该通过CallXYZMethod()
(参数列表)还是CallXYZMethodA()
(参数数组)传递构造函数参数?
感谢您的意见。
编辑:略微改编; 2.当然不需要是一类,如果有一些其他的解决方案来处理Java端的C数据,我并不需要Java方面的结构。
编辑2:我在C ++中这样做,但结构本身源于C-linkage回调函数,即没有C ++特定的问题。改为阅读“C”而不是“C ++”。
答案 0 :(得分:1)
对不起,我没有时间写一个深思熟虑的答案,或者进一步研究这个问题,但不久前我不得不与JNI做了很多工作,我发现使用SWiG非常有帮助。我不确定它的效率,但我想它会生成相当高效的代码。
无论如何,请查看SWiG Passing structures by value和Structures上的{{3}}。
祝你好运。答案 1 :(得分:1)
为了提高效率,最好尽量减少通过JNI的呼叫,因此最好的办法是通过选项1发送所有数据并创建新对象。
如果你想避免为每次更新分配一个新对象,你也可以在Java端有一个“recieveUpdate(... 40 params ...)”方法,尽管它的设计非常糟糕。