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

标签 java c++ java-native-interface iostream outputstream

我正在编写一个通过 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/

相关文章:

java - MaskFormatter 可以采用任何尺寸,还是只能采用您提供的尺寸?

java - 如何在EJB 3.1中缓存EJB远程接口(interface)?

java - JNI java.lang.UnsatisfiedLinkError

java - 如何在不同类名的接口(interface)中定义抽象方法?

java - JAX-WS 能否用于让服务器在客户端上执行 Web 服务调用?

c++ - 使用 STL 的类模板无法编译

c++ - ifstream 读取所有以开头的文件

c++ - 我如何在 winXP 中创建一个隐藏进程窗口(从任务栏)的进程?使用 CreateProcess 函数?

java - java.io.FileOutputStream.write(int, boolean) native 方法的源代码

android - 从 java 调用 native 方法时的 Libc SIGSEGV