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 は stdout を正しく解析していますか? C++ だけで hello world を実行すると、Java でそれを見ることができますか?

最初からやり直し、可能な限り単純な C++ プログラムで動作するようにし、ゆっくりと C++ を複雑化する (ロジックを元に戻す) ことをお勧めします。

  • 最初に java から hello world を呼び出し、出力が Java で正しく読み取られることを確認します
  • 次に、いくつかの引数を追加し、出力が Java で正しく読み取られるようにします。
  • 次に、ロジックを少し追加して、出力が Java から正しく読み取られるようにします。

そして、C++ が常に Java で正しく動作することを確認してください。できれば自動化されたテストを書いてください:)


何が起こったのかというと、アプリケーションのエンドツーエンドの統合ビルドを最初から持っていなかったという重大な罪を犯したということです。あなたが感じる痛みは、あなたの罪を償うことです :P .

もちろん冗談ですが、真剣に、次回はできるだけ早く C++ を統合することをお勧めします! その統合ポイントは、どのソフトウェアでも常に問題の原因となります (私は知っています)。それらを早期に解決することは、後でロジックに集中できるようにするための優れた方法です。読書を提案できる場合は、 Growing object oriented software guideed by testをチェックしてください。これは、この種のアプローチの素晴らしいデモンストレーションです。

于 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 に答える