Основная проблема заключается в том, что я не могу запустить свою логику c ++, запустив ее через Java; я правильно создаю подпроцесс?
Спасибо вам всем;
— ОБНОВИТЬ! —
Итак, я написал их, чтобы проверить способность открывать .exe самым простым способом; Затмение может видеть файл / не жалуется, что его там нет; побежал с помощью кнопки запуска в 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;
}
Выход:
ноль
Процесс, созданный ProcessBuilder, имеет стандартные потоки ввода, вывода и ошибок, и если вы не будете записывать в его входной поток или читать из его выходных потоков, он зависнет. Смотрите следующие вопросы для получения дополнительной информации:
Почему процесс зависает, если родитель не использует stdout / stderr в Java?
Java ProcessBuilder: результирующие зависания процессов
Также возможно, что процесс никогда не запускается, потому что либо пользователь, под которым он запущен, не имеет необходимых разрешений для его запуска, либо потому, что некоторые DLL не могут быть загружены, либо, возможно, по какой-то другой причине.
Невозможно использовать taskkill.exe из процесса Java
Я создал модифицированную версию вашей программы. Когда я запускаю его из командной строки, он может выполнить 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 был скомпилирован из вашего исходного кода C ++ в вопросе с использованием g ++ 4.8.2 под 32-битным Cygwin.)
Вы называете это с правильными аргументами? Имеет ли C ++ правильный рабочий каталог? Правильно ли разбирает Java стандартный вывод? Если вы только здороваетесь с C ++, можете ли вы увидеть его на Java?
Я предлагаю начать с самого начала, заставить его работать с самой простой из возможных программ на C ++ и медленно усложнять C ++ (возвращая свою логику)
И убедитесь, что C ++ все дни правильно работает с Java. Напишите автоматизированные тесты, если можете 🙂
То, что произошло, — это то, что вы совершили главный грех, потому что у вас не было комплексной интегрированной сборки вашего приложения с самого начала. Боль, которую ты чувствуешь, это то, что ты искупаешь свое преступление
Я, конечно, шучу, но серьезно, в следующий раз я бы предложил интегрировать C ++ как можно скорее! Это те точки интеграции, которые всегда являются источником проблем в любом программном обеспечении (я бы знал). Их раннее решение — отличный способ убедиться, что вы сможете сосредоточиться на логике позже. Если бы я мог предложить чтение, проверьте Растущее объектно-ориентированное ПО, ориентированное на тестирование, это отличная демонстрация такого подхода.