通过 JNI 接口共享输出流

2023-12-25

我正在编写一个通过 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(使用前将#替换为@)

通过 JNI 接口共享输出流 的相关文章

随机推荐