0

主要问题是我无法通过 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;
}

输出:

无效的

4

2 回答 2

2

你用正确的论据来称呼它吗?C++ 是否有正确的工作目录?Java 是否正确解析标准输出?如果你只在 C++ 中做一个 hello world,你能在 Java 中看到它吗?

我建议从头开始,让它与最简单的 C++ 程序一起工作,然后慢慢复杂化 C++(回到你的逻辑中)

  • 首先从 java 调用一个 hello world,并确保在 Java 中正确读取输出
  • 然后添加一些参数并确保在java中正确读取输出,
  • 然后添加一点逻辑,并确保从 Java 中正确读取输出。

并确保 C++ 始终与Java一起正常工作。如果可以的话,编写自动化测试:)


发生的事情是,您从一开始就犯下了没有端到端集成构建应用程序的大罪。你感受到的痛苦是你在为你的罪行赎罪:P。

我当然是在开玩笑,但说真的,下一次,我建议您尽快集成 C++!它的那些集成点始终是任何软件中的问题根源(我知道)。尽早解决它们是确保您以后可以专注于逻辑的好方法。如果我可以建议阅读,请查看以测试为指导的越来越多的面向对象软件,这是对这种方法的一个很好的演示。

于 2014-04-01T21:04:13.087 回答
0

ProcessBuilder 创建的进程有标准输入、输出和错误流,如果你不写入它的输入流或从它的输出流中读取,它就会挂起。有关详细信息,请参阅以下问题:

如果父进程不使用 Java 中的 stdout/stderr,为什么进程会挂起?

Java ProcessBuilder:结果进程挂起

该进程也可能永远不会启动,因为它正在运行的用户没有启动它的必要权限,或者因为某些 DLL 无法加载,或者可能由于其他原因。

无法从 Java 进程使用 taskkill.exe

我已经创建了您的程序的修改版本。当我从命令行运行它时,它能够执行 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++ 源代码编译的。)

于 2014-04-01T21:28:28.193 回答