与Java C可执行文件通信

时间:2013-06-21 22:42:10

标签: java c

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

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

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

我的C程序的主要方法是:

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获取输出。

3 个答案:

答案 0 :(得分:1)

如果您只需要stdinput / output,那么您可以很容易地使用ProcessBuilder或某种形式的System.exec来获取相应的流。

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

小心线程,但玩得开心!

答案 1 :(得分:0)

在继续阅读之前,您需要先阅读有关JNI的内容。谷歌是你的朋友。

坦率地说,你的主要C方法很简短。你为什么不想再用Java写这个?

答案 2 :(得分:0)

其他好的库允许轻松访问本机文件JNA。也许Runtime课可能会帮助你。