主要问题是我无法通过Java运行我的c ++逻辑; 我是否正确创建了子进程?
谢谢大家; ---更新! ---
所以我写了这些来测试以最纯粹的方式打开.exe的能力; Eclipse可以看到文件/没有抱怨它不存在;使用Eclipse中的运行按钮运行:
java文件:
import java.io.*;
public class Runs_A_Exe {
public static void main( String[] args ){
try {
ProcessBuilder pb = new ProcessBuilder( "M:\\aaa\\bbb\\ccc\\ddd\\eee\\workspace\\Runs Simple Exe\\src\\executables\\a.exe" );
Process p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
System.out.println( br.readLine() );
}
catch ( Exception e ) {
System.out.println( e );
}
}
}
c ++文件:
#include <iostream>
int main( void ) {
std::cout << "Hey!" << std::endl;
}
输出:
空
答案 0 :(得分:2)
您是否使用正确的参数调用它? C ++是否有正确的工作目录? Java是否正确解析了stdout?如果你只用C ++做一个hello world,你能用Java看到它吗?
我建议从头开始,使用最简单的C ++程序,慢慢地复杂化C ++(重新放入逻辑)
确保C ++ 总是与Java一起正常工作。如果可以,写下自动化测试:)
发生的事情是,您承诺从一开始就没有端到端的应用程序集成构建。你感受到的痛苦是你在犯罪:P。
我当然是在开玩笑,但是说真的,下次我会建议你尽快整合C ++!它的那些集成点始终是任何软件中的问题来源(我知道)。及早解决它们是确保您以后可以专注于逻辑的好方法。如果我可以建议阅读,请查看Growing object oriented software guided by test,这是对这种方法的一个很好的证明。
答案 1 :(得分:0)
ProcessBuilder创建的进程具有标准输入,输出和错误流,如果您不写入其输入流或从其输出流中读取,它将挂起。有关详细信息,请参阅以下问题:
Why does process hang if the parent does not consume stdout/stderr in Java?
Java ProcessBuilder: Resultant Process Hangs
也可能永远不会启动该进程,因为它正在运行的用户没有启动它的必要权限,或者因为某些DLL无法加载,或者可能由于某些其他原因。
Unable to use taskkill.exe from a Java process
我已经创建了程序的修改版本。当我从命令行运行它时,它能够执行exe文件,但是当我从Eclipse项目执行相同操作时,该过程返回退出代码-1073741515,根据上面的问题,该代码表示“应用程序”无法正确初始化。“我认为您需要调查Eclipse调用java来运行您的exe的环境(运行它的用户,如何设置PATH等),以及exe的所有依赖项是否可用(DLL是做什么的)依赖于)来确定它没有成功运行的原因。
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
public class Runs_An_Exe {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = new ProcessBuilder("c:/cygwin/tmp/a.exe");
pb.redirectErrorStream(true); // redirect stderr to stdin
Process p = pb.start();
final StringWriter writer = new StringWriter();
final InputStreamReader isr = new InputStreamReader(p.getInputStream());
// capture all output from the process
new Thread(new Runnable() {
@Override public void run() {
readAll(isr, writer);
}
}).start();
// wait for it to finish, and display the exit code
int result = p.waitFor();
System.out.println("result: " + result);
// display any output from the process
System.out.println(writer.toString());
}
private static void readAll(Reader reader, Writer writer) {
try {
char[] buffer = new char[8192];
int n = 0;
while (-1 != (n = reader.read(buffer))) {
writer.write(buffer, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(我使用的a.exe是在32位Cygwin下使用g ++ 4.8.2从问题的C ++源代码编译而来的。)