将对象的地址传递给JNI和JNI方法应填充该传递对象的字段

时间:2011-02-21 21:50:22

标签: java java-native-interface

我想传递一个java对象的地址,JNI方法应该填充传递的对象的字段。 1. java代码传递给定的对象引用。 JNI方法应该能够缓存此Object。这是一次通话。 2.然后java对象使用不同的参数重复调用工作本机方法,并且JNI应该能够每次填充缓存对象的字段。虽然它填充了相同的缓存对象,但它不会返回任何空格。 3.调用#work本机方法之后的java每次使用相同的对象引用(在init期间传递)并获取引用对象的更新字段。 4.工作方法经常在一秒钟内被调用(不止一次)。

讨论设计,涉及的风险等以及任何高度赞赏的建议。 注意:不太重视不使用JNI,已经存在很多线程。更重要的是给定JNI,垃圾收集的风险,使用什么样的参考(全局,弱),这个设计好/坏,怎么可以做得更好等?

期待更多回复

2 个答案:

答案 0 :(得分:2)

您可以通过缓存字段查找和类元数据获得。

不确定通过缓存对象本身会在性能方面获得多少收益。但如果你愿意,你可以这样做。恕我直言,每次传递对象都会更清晰。

我有类似的结构,每秒调用的方法超过100K次。

答案 1 :(得分:2)

使用您当前的设计:

  1. 使用env->NewGlobalRef获取对象的永久引用。使用env->GetObjectClass获取类ID。使用env->GetFieldID检索字段ID,缓存这些ID。

  2. 使用对象引用和记住的字段ID使用env->Set<Type>Field

  3. 我建议在每个调用中传递对象,缓存引用并没有多少收获。