我想传递一个java对象的地址,JNI方法应该填充传递的对象的字段。 1. java代码传递给定的对象引用。 JNI方法应该能够缓存此Object。这是一次通话。 2.然后java对象使用不同的参数重复调用工作本机方法,并且JNI应该能够每次填充缓存对象的字段。虽然它填充了相同的缓存对象,但它不会返回任何空格。 3.调用#work本机方法之后的java每次使用相同的对象引用(在init期间传递)并获取引用对象的更新字段。 4.工作方法经常在一秒钟内被调用(不止一次)。
讨论设计,涉及的风险等以及任何高度赞赏的建议。 注意:不太重视不使用JNI,已经存在很多线程。更重要的是给定JNI,垃圾收集的风险,使用什么样的参考(全局,弱),这个设计好/坏,怎么可以做得更好等?
期待更多回复
答案 0 :(得分:2)
您可以通过缓存字段查找和类元数据获得。
不确定通过缓存对象本身会在性能方面获得多少收益。但如果你愿意,你可以这样做。恕我直言,每次传递对象都会更清晰。
我有类似的结构,每秒调用的方法超过100K次。
答案 1 :(得分:2)
使用您当前的设计:
使用env->NewGlobalRef
获取对象的永久引用。使用env->GetObjectClass
获取类ID。使用env->GetFieldID
检索字段ID,缓存这些ID。
使用对象引用和记住的字段ID使用env->Set<Type>Field
。
我建议在每个调用中传递对象,缓存引用并没有多少收获。