从Java与C可执行文件通信

从Java与C可执行文件通信,java,c,Java,C,我有一个C可执行文件,我可以从CYGWIN运行它。我还想从JAVA运行相同的文件。C程序通过stdin和stdout获得输入和输出。它主要获取字符串并输出字符串 我想我可以用process builder成功启动该程序。但是我不能与C程序交互。要使用ProcessBuilder启动.exe,请参见以下内容 Process cmd = new ProcessBuilder("path to exe").start(); 我的C程序的主要方法如下: int main(argc, argv) { /

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

我想我可以用process builder成功启动该程序。但是我不能与C程序交互。要使用ProcessBuilder启动.exe,请参见以下内容

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);
}
}
int main(argc、argv)
{
/*设置命令行或配置文件参数*/
配置(argc、argv);
/*读取语法、初始化解析器、malloc空间等*/
初始化解析(dir、dict文件、语法文件、帧文件、优先级文件);
/*每一句话*/
而(fgets(线路,线路1,fp)){
/*为帧中的插槽指定字串*/
解析(行,克);
/*打印解析到缓冲区*/
对于(i=0;i

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

在继续之前,您需要开始阅读JNI。谷歌是你在这里的朋友


坦率地说,您的主要C方法很短。为什么不想再次用Java编写此文件?

另一个允许轻松访问本机文件的好库是
JNA
。也许运行时
类会对您有所帮助。

如果您只需要标准输入/输出,那么您可以使用或某种形式的

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


小心线程,但要玩得开心!

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