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

标签 java c java-native-interface

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

执行此操作的有效方法是什么?

我能想到的:

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

我是不是忽略了什么? (这是我与 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/

相关文章:

java - 如何将多Activity转化为少Activity?

c - 执行一个将字符串从基数转换为 int 的函数

java - JNI 上的运行时

java - bean的Spring Boot Autowiring 在maven多模块项目中不起作用

java - 如何使用变量来指定数组长度?

c - OCaml 的 MIT-SHM 绑定(bind)

java - SoundTouch 和 JNI

java - 使用 C++ 时找不到 native 方法

java - System.out.print() 在测试方法中不显示任何内容

c - 可能出了什么问题, ls 在我自己的 shell 上不起作用