【问题标题】:Communicate with C executable From Java从 Java 与 C 可执行文件通信
【发布时间】:2013-06-21 22:42:10
【问题描述】:

我有一个 C 可执行文件,我可以从 CYGWIN 运行它。我也想从 JAVA 运行相同的文件。 C 程序通过标准输入和标准输出获得输入和输出。主要是获取字符串,输出字符串。

我想我可以使用流程构建器成功启动程序。但是我无法与 C 程序交互。要启动 .exe,我使用 ProcessBuilder,请参见以下内容。

Process cmd = new ProcessBuilder("path to exe").start();

我的C程序的main方法在这里:

int main(argc, argv)
{
/* set command line or config file parms */
config(argc, argv);
/* read grammar, initialize parser, malloc space, etc */
init_parse(dir, dict_file, grammar_file, frames_file, priority_file);
/* for each utterance */
while( fgets(line, LINE_LEN-1, fp) ) {
/* assign word strings to slots in frames */
parse(line, gram);
/* print parses to buffer */
for(i= 0; i < num_parses; i++ )
print_parse(i, out_ptr, extract, gram);
/* clear parser temps */
reset(num_nets);
}
}

我的目标是发送输入并从 Java 中获取输出。

【问题讨论】:

    标签: java c


    【解决方案1】:

    如果您只需要标准输入/输出,那么您可以很容易地使用ProcessBuilder 或某种形式的System.exec 获得适当的流。

    然后生成输出并解析输入但是 小心。输入和输出流通常应该在不同的线程中处理。否则很容易出现死锁,因为大多数程序不会期望 stdin 和 stdout 绑定到单个进程(例如,当您仍在尝试写入 stdin 流时,stdout 会填充您的输入缓冲区。您的写入是阻塞等待程序读取更多内容,它不会,因为它的写入被阻塞等待您阅读更多内容。经典。)

    小心线程但玩得开心!

    【讨论】:

      【解决方案2】:

      在继续之前,您需要开始阅读有关 JNI 的内容。 Google 是您的朋友。

      坦率地说,您的主要 C 方法很短。你为什么不想再用 Java 写一遍呢?

      【讨论】:

      • 这段代码执行了一个用C编写的解析器。我需要以某种方式与解析器通信,这是与它通信的接口。
      【解决方案3】:

      其他可以轻松访问本机文件的好库是JNA。也许Runtime 类可能会对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-02-28
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 2014-01-21
        相关资源
        最近更新 更多