我正在研究通过JNI将JRE集成到C ++应用程序中。
在C ++应用程序中持有大量Java对象引用的开销是多少(JNI用语中的全局引用)?
使用这种方法我是否应该注意到任何问题(除了显而易见的,例如手动解除分配引用)?
答案 0 :(得分:3)
(a)开销与从Java进行开销相同。您正在阻止对象被垃圾收集。
(b)除非您正确执行,否则跨JNI调用保持对象引用对JVM可能是致命的。您需要仔细阅读JNI规范中有关全局和本地引用的部分。您还需要考虑使用弱引用而不是全局引用。
答案 1 :(得分:-2)
这更多的是一种观点而非答案,但考虑到您可以选择,我强烈建议不要使用JNI,而是使用其他机制(如套接字或Web服务)在C ++应用程序和Java VM之间进行通信。如果你做对了,JNI解决方案显然会比这两种方案快得多,但如果性能并不重要,那么我对JNI的体验是最好避免使用。
正如EJP正确指出(+1)如果你没有正确管理你的JNI Java对象,会发生非常糟糕的事情 - 包括虚拟机死亡。我也发现JNI代码很难测试。