【问题标题】:JNI - connecting STDOUT to a JTextArea?JNI - 将 STDOUT 连接到 JTextArea?
【发布时间】:2011-03-30 07:11:16
【问题描述】:

我想知道是否可以将 C/C++ dll 的 STDOUT 连接到 JTextArea?问题是,我使用的是第 3 方 DLL,所以我无法手动更改它们。 基本上我有我的 Java 小程序,然后是我自己的 DLL,它加载和管理第 3 方 DLL,它是第 3 部分 DLL,它执行诸如 printf() 之类的操作。它在调试期间显示在 Eclipse 控制台中,但我希望它在 JTextArea 或其他东西中。

编辑:澄清一下,我在我的 win32 DLL 中使用 std::cout。

谢谢

【问题讨论】:

    标签: java c++ swing applet java-native-interface


    【解决方案1】:

    什么是标准输出?如果是 Posix 文件句柄,那么你可以做的不多 做。您必须关闭它,然后打开一个临时文件,写入该文件, 然后在Java部分阅读它。如果您实际上正在使用 std::cout 对于输出,可以(临时)更改 它使用一个 stringbuf,然后将生成的字符串传递给 Java。

    【讨论】:

    • 是的,我在 c++ win32 中使用 std::cout。能详细说说怎么做吗?
    • 类似:`std::stringbuf str; std::streambuf* 保存 = std::cout.rdbuf(); std::cout.rdbuf(&str); // 输出... std::cout.rdbuf(save); // 最好使用 RAII // 现在将 str.str() 转换为 Java 字符串。 ` 当然,如果您的代码输出到std::ostream,就像它应该的那样,没有问题:只需使用std::ostringstream
    • 谁能告诉我我必须怎么做才能使上述注释中的代码格式正确?
    • 1.您知道是否可以直接流式传输到 JTextArea 的文本空间中吗? 2. 'str' 和 'save' 不是要同时使用吗? 3.有没有比让线程运行更好的方法,当它检测到缓冲区中的输入时,转换为java字符串并打印出来?
    • @KaiserJohaan 几乎肯定不会。您几乎可以肯定必须创建一个 java.lang.String 对象,并将其传递给 JTextArea 对象。 (JTextArea中的文本空间是一个Document,它本身就是一个复杂的类,可能包含嵌套的Document等,不是一个简单的缓冲区。)
    【解决方案2】:

    您可以在 DLL 中将标准输出重定向到文件或管道。然后您可以从 Java 中的文件或管道中读取并将您读取的内容复制到您的 JTextArea。另一种选择是将您的 DLL 移动到它自己的进程中,您将从 Java 开始,然后从进程的标准输出中读取并写入您的 JTextArea。

    SetStdHandle (link to MSDN) 将允许您重定向标准输出。

    【讨论】:

    • 我很难找到在 Java 中打开管道的方法。如果事实证明这是不可能的,另一种方法是让您的 DLL 使标准输出可用作套接字。该方法是这样的: (1) 创建一个管道。 (2) SetStdHandle 将标准输出设置为管道的可写端。 (3) 创建一个socket,绑定一个端口,等待连接。 (4) 当客户端连接时,从管道读取数据并将其数据写入套接字。 (5) 在 Java 中,连接到端口并将数据从端口复制到 JTextArea。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多