如何从 Java 调用 Foo::print 以使输出显示在 out 上?
从概念上讲,让 Foo::print(...) 写入现有 Java OutputStream 实例的方法是编写一个 C++ std::ostream 实现,该实现实际上对 Java 进行回调以进行输出。
这听起来可能,但我不想编写/维护代码。在运行时,您将有来自 Java -> C++ -> Java 的调用,并且有很多机会犯错误,这些错误会随机使您的 JVM 崩溃。
有没有办法将 OutputStream 强制转换为 JNI 层中的 std::ostream ?
AFAIK 没有。
我可以在 JNI 层的缓冲区中捕获输出,然后将其复制到 out 中吗?
你的意思大致是这样的吗?
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 中做越来越复杂的事情。IMO,JNI 仅应作为最后的手段使用,而不是避免在 Java 中重新编码内容的捷径。