Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过JNI接口共享输出流 我正在编写一个java应用程序,它使用JNI接口通过C++接口。C++库创建类型为_Java_C++_Java Native Interface_Iostream_Outputstream - Fatal编程技术网

通过JNI接口共享输出流 我正在编写一个java应用程序,它使用JNI接口通过C++接口。C++库创建类型为

通过JNI接口共享输出流 我正在编写一个java应用程序,它使用JNI接口通过C++接口。C++库创建类型为,java,c++,java-native-interface,iostream,outputstream,Java,C++,Java Native Interface,Iostream,Outputstream,假设库有一个输出函数 void Foo::print(std::ostream &os) 我有一个Java输出流。如何从Java调用Foo::print,使输出显示在out?有没有办法将OutputStream强制到JNI层中的std::ostream?我是否可以在JNI层的缓冲区中捕获输出,然后将其复制到out 如何从Java调用Foo::print 使输出显示为on out 概念上,获得Fo:::打印(…)到现有java OutuSoScript实例的方法是编写C++ STD:::

假设库有一个输出函数

void Foo::print(std::ostream &os)
我有一个Java
输出流
。如何从Java调用
Foo::print
,使输出显示在
out
?有没有办法将
OutputStream
强制到JNI层中的
std::ostream
?我是否可以在JNI层的缓冲区中捕获输出,然后将其复制到
out

如何从Java调用Foo::print 使输出显示为on out

概念上,获得Fo:::打印(…)到现有java OutuSoScript实例的方法是编写C++ STD:::OFFACTS实现,它实际上对java进行回调以完成输出。p> 这听起来是可能的,但我不想编写/维护代码。在运行时,你会有从java到C++的-> java的调用,而且有很多错误的机会,这些错误会随机地破坏你的JVM。 有没有什么办法可以强迫他们 将流输出到中的std::ostream JNI层

阿法克号

我可以在缓冲区中捕获输出吗 JNI层,然后将其复制到 出去

你的意思大概是这样的吗

    MyJNIThing m = ...
    int myOstream = m.createMemoryBackedOStream(...); // native method
    ...
    m.someMethodWrapper(... myOStream); // native method
    ...
    byte[] data = m.getCapturedData(myOStream); // native method
    out.write(data);
你也许可以做一些类似的工作。。。在顺风的好天气


<>但是我认为你应该真正的目标是消除C++代码,而不是试图在JNI上做越来越复杂的事情。在我看来,JNI只能作为最后的手段,而不是避免在Java中重新编码的捷径。

我已经发布了一篇文章,详细介绍了我最近处理这个问题的经验。通常,您希望避免尝试使用任何语言将输入或输出流连接到客户端,因为这意味着线程。你可以使用回调增量递送数据。

< P>我将实现一个C++流,它缓冲了写(直到一定的大小),然后通过JNI将这些写刷新到java OuttSoots。p> 在java方面,您可以使用常规OutputStream实例,也可以实现缓冲区块的排队(基本上是字节[]),以避免线程之间任何可能的锁定争用。实际输出流仅由另一个线程上的任务使用,该线程从队列中提取块并将其写入OutpuStream。在这个细节层次上,我不能说这是必要的还是不必要的——您可能会发现直接从JNIWorks向输出流写入代码

我不与JNI分享其他问题,也不认为在这方面使用JNI有任何问题。当然,您的维护人员必须了解他们的工作,但仅此而已,Java/C++层的复杂性可以通过文档、示例和测试用例来管理。在过去,我实现了一个JavaCOM桥接器,它有一个非常健谈的接口——在性能、线程或维护方面没有问题


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

用Java重新实现库不是一个选项(它是大型、成熟和性能密集型的)。也许你不应该尝试从Java调用它。我的观点是,你很可能会给你自己和那些不得不维护你的代码的人带来很多痛苦。虽然我同意JNI代码很棘手,说你应该完全避免它是不公平的。JNI肯定有一席之地,特别是像上面提到的op这样的大型遗留项目,在我的例子中,第三方API是完成工作所必须使用的。这是一个非常有效的问题,我也在寻找答案。@Cliff-也祝你好运。请注意,还没有人给出一个例子。祝我好运,因为我现在自己也给出了一个例子!请看下面我的回答。