我正在编写一个通过 JNI 接口使用 C++ 库的 Java 应用程序。 C++ 库创建类型的对象Foo
,它们通过 JNI 适当地传递到 Java。
假设库有一个输出函数
void Foo::print(std::ostream &os)
我有一个JavaOutputStream out
。我怎样才能调用Foo::print
来自 Java,以便输出出现在out
?有什么办法可以强制OutputStream
to a std::ostream
在JNI层?我可以捕获 JNI 层缓冲区中的输出,然后将其复制到out
?
我将实现一个 C++ ostream,在通过 JNI 将这些写入刷新到 java OutputStream 之前缓冲写入(达到某个设定大小)。
在 java 方面,您可以使用常规 OutputStream 实例,也可以实现缓冲区块(本质上是 byte[])的排队,以避免线程之间任何可能的锁定争用。真正的输出流仅由另一个线程上的任务使用,该任务从队列中提取块并将其写入 OutpuStream。我不能说这是否有必要在这个详细程度 - 您很可能会发现直接从 JNI 写入输出流是可行的。
我不同意其他发帖者对 JNI 的担忧,并且不认为使用 JNI 来实现此目的有任何问题。当然,您的维护人员必须了解他们的东西,但仅此而已,并且 Java/C++ 层的复杂性可以通过文档、示例和测试用例来管理。过去,我实现了一个 JavaCOM 桥,其界面相当繁琐 - 性能、线程或维护没有问题。
如果有完全自由的选择,就不会有 JNI,但对我来说,它通过使原本不兼容的系统的紧密集成成为可能而挽救了局面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)