Создание нового процесса в C ++ и выполнение файла .jar - PullRequest
1 голос
/ 11 марта 2011

Я пытаюсь написать программу, которая будет читать вывод из файла java .jar, а также время от времени вводить его. По сути, я надеюсь создать программу, которая будет выполнять определенные функции при обнаружении определенных выходных данных.

Файл .jar не был создан мной, и у меня нет исходного кода, поэтому я должен использовать его как есть. Проведя некоторое исследование, я решил, что fork() и execl() в сочетании с конвейерами - это метод, который мне нужно будет использовать, и я создал небольшую программу, которая успешно делает это с программой hello world. Как только я собирался изменить его для запуска программы .jar, я понял, что .jar не исполняется сам по себе, я должен выполнить его через java, и теперь я не могу понять, как сделать execl() работа с .jar.

Я попытался выяснить, как заставить execl () запускать java и использовать аргумент, который определяет файл jar для выполнения следующим образом:

execl("java","java","jar myprog.jar",NULL);

Хотя я не знаю, сработает ли этот метод. Если это произойдет, я не знаю, какой путь использовать. Я видел, как некоторые люди рекомендуют использовать JNI для аналогичных целей, но ни один из них, казалось, не вполне соответствовал тому, что я делал, и после небольшого исследования я не совсем уверен, что это будет лучшим способом. popen () кажется еще одной возможностью, но я еще не нашел ничего, что объясняло бы, как правильно его использовать.

Любой совет будет принят с благодарностью.

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Если вы хотите вызывать различные функции Java из среды C ++, вам нужно будет использовать JNI. Создайте виртуальную машину Java внутри вашей C ++ программы и используйте ее для загрузки jar. Затем вы можете вызывать функции, которые предоставляет jar.

Вот достойное резюме. http://www.codeproject.com/KB/cpp/CJniJava.aspx

1 голос
/ 11 марта 2011

Для поиска исполняемого файла Java: если вы хотите найти его в PATH, вы можете использовать execlp вместо execl.В противном случае вы можете сделать его настраиваемым (файл конфигурации или переменная env.).Для файла jar вы можете найти его в текущем каталоге или снова в настраиваемом месте.

Например, для java в PATH и myprog.jar в текущем рабочем каталоге:

ret = execlp("java", "java", "-jar", "myprog.jar", (char *) 0);

1 голос
/ 11 марта 2011

Вы бы начали с:

java -jar myprog.jar

Так как это командная строка, вам нужно ...

execl("java", "java", "-jar", "myprog.jar", NULL);

(При условии, что Java находится на вашем пути. Если это не так, вам нужен полный путь к Java.)

...