我有一个大型 C 结构(大约 40 个成员,int 和 char[]),我必须通过 JNI 将其传递到 Java 端以进行进一步处理。这种情况反复发生。 (我已经将 GetMethodID()
等放入 C 端的 init()
函数中,因此我只需调用它们一次。)
执行此操作的有效方法是什么?
我能想到的:
- 通过
GetMethodID( ..., "<init>", ... )
实例化具有适当成员的 Java 类并通过构造函数传递 C 结构的所有成员; - 为 Java 结构分配适当的成员,并通过
SetXYZField()
初始化(公共(public))成员; - ...
我是不是忽略了什么? (这是我与 JNI 的第一次“近战”。)真的没有有效的方法来“同步”C 结构和 Java 结构吗?
什么是更有效的传递方法,1. 或 2.?在 1. 的情况下,我是否应该通过 CallXYZMethod()
传递构造函数参数? (参数列表)或 CallXYZMethodA()
(参数数组)?
感谢您的输入。
编辑 略微改写; 2. 当然不需要是一个类,如果有其他解决方案来处理 Java 端的 C 数据,我并不严格需要 Java 端的结构。
编辑 2: 我在 C++ 中执行此操作,但结构本身源于 C 链接回调函数,即没有任何 C++ 特定于该问题。改写为“C”而不是“C++”。
最佳答案
为了纯粹的效率,最好尽量减少通过 JNI 的调用,因此最好的办法是通过选项 1 发送所有数据并创建一个新对象。
如果您想避免每次更新都分配一个新对象,您也可以在 Java 端使用“recieveUpdate( ... 40 params ...)”方法,尽管这是一个令人畏惧的设计。
关于java - 通过JNI有效地传递大型C结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571175/