gpt4 book ai didi

java - 通过 JNI 接口(interface)共享输出流

转载 作者:IT老高 更新时间:2023-10-28 23:01:48 26 4
gpt4 key购买 nike

我正在编写一个通过 JNI 接口(interface)使用 C++ 库的 Java 应用程序。 C++ 库创建类型为 Foo 的对象,这些对象通过 JNI 适本地传递给 Java。

假设库有一个输出函数

void Foo::print(std::ostream &os)

我有一个 Java OutputStream 输出。如何从 Java 调用 Foo::print 以便输出出现在 out 上?有没有办法将 OutputStream 强制为 JNI 层中的 std::ostream ?我可以在 JNI 层的缓冲区中捕获输出,然后将其复制到 out 中吗?

最佳答案

在通过 JNI 将这些写入刷新到 java OutputStream 之前,我将实现一个 C++ ostream 来缓冲写入(达到某个设定大小)。

在 java 方面,您可以使用常规的 OutputStream 实例,也可以实现缓冲区 block (本质上是 byte[])的排队,以避免线程之间任何可能的锁定争用。真正的输出流仅由另一个线程上的任务使用,该线程从队列中拉出 block 并将它们写入 OutpuStream。在这个细节级别上我不能说这是否必要——你可能会发现直接从 JNI 写入输出流是可行的。

我没有与 JNI 分享其他发帖人的担忧,并且认为使用 JNI 没有任何问题。当然,你的维护者必须知道他们的东西,但仅此而已,Java/C++ 层的复杂性可以通过文档、示例和测试用例来管理。过去,我已经实现了一个 Java<>COM 桥,它的接口(interface)非常健谈——性能、线程或维护都没有问题。

如果有完全自由的选择,就没有 JNI,但对我来说,它通过使原本不兼容的系统的紧密集成成为可能,从而节省了时间。

关于java - 通过 JNI 接口(interface)共享输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1435173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com