问题描述
|
我正在考虑通过JNI将JRE集成到C ++应用程序中。
在C ++应用程序中保存对Java对象的大量引用的开销是多少(在JNI看来是全局引用)?
使用此方法时,我是否应该注意任何问题(除了显而易见的问题之外,例如手动取消分配引用)?
解决方法
(a)开销与您从Java进行的开销相同。您正在防止对象被垃圾回收。
(b)除非正确执行,否则在JNI调用中保留对象引用可能对JVM致命。您需要仔细阅读JNI规范中有关全局和本地引用的部分。您还需要考虑使用弱引用而不是全局引用。
,这更多的是意见而不是答案,但是考虑到您的选择,我强烈建议您不要使用JNI,而应使用Sockets或Web服务等其他机制在C ++应用程序和Java VM之间进行通信。如果您做对了,那么JNI解决方案显然会比这两种方法都快得多,但是如果性能不是很关键,那么我对JNI的经验就是最好避免这样做。
正如EJP正确指出的那样(+1),如果您不能正确管理JNI Java对象,则将发生非常糟糕的事情-包括VM即将死亡。我还发现很难测试JNI代码。