2010-04-06 6 views
2

мне нужно запустить эту строку из моей с программой ++ C++:Как позвонить Java из

Java -jar test.jar text1 text2

Java-приложение даст значение с плавающей точкой и передать его в C++ программа.

Как это сделать? Я никогда не называю java-материал раньше из моего файла Visual C++ visual studio.

+0

Почему вы не согласны ответы на любые ваши вопросы? – Shaihi

+0

Я не знаю, что мне нужно принять ответы. кстати, как принять? – karikari

+0

похоже, что он «принял» свой «ответ», что является другим вопросом. < – Kayvar

ответ

0

Когда Я запускаю java-команду непосредственно в командной строке, она работает. но когда я запускаю команду из файла C++, ошибка говорит: «Система не может выполнить указанную программу».

вот мой код, им с помощью MS Visual Studio 2005:

#include "stdafx.h" 

#include <conio.h> 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    float value; 

    FILE *child = _popen("java -jar c:\simmetrics_jar_v1_6_2_d07_02_07.jar text1 ssdyr445", "r"); 
    if (fscanf(child, "%f", &value) == 1) 
     { 
      fprintf(stdout,"Got Value from simmetrics: %f\n", value); 
    } 
    else 
     { 
      fprintf(stdout,"ERROR\n"); 
     } 
    fclose(child); 

    return 0; 
} 
4

Если вы хотите использовать сильную связь, используйте JNI wrapper.

-1

Самый простой, если Вы можете изменить свой код Java:

написать результат в переменной окружения (псевдо код ниже): (.. Написать непосредственно окр в Java приложение)

решение 1.

Java:

... 
setenv('ret', somefloatvalue); 
... 

exit.. 

C++:

system("java -jar test.jar text1 text2") 
... 
getenv("ret") 

(я не проверял, но важно здесь контекст, делает система создает еще одну оболочку (консоли), если да, то вы не будете видеть эти envs, поэтому какой-либо другой метод икру необходимо)

CreateProcess() на окнах fork() on linux.

Есть также более сложные решения,

  • отправить некоторые Ясона через сокеты .... и т.д.
  • Запись в текстовый файл в Java, читать в C++.
  • MPI ...
  • крайним в этом случае CORBA;)
+0

Я действительно не думаю, что это работает как «set». – Blindy

+0

Не проверял, вы правы, исправлены, спасибо. – bua

+0

Это не сработает. Когда система вращается, она создает свою среду для запуска приложения (копия среды C++ родителей). Когда приложение Java изменяет среду, оно модифицирует свою среду (а не ее родителей). Таким образом, родитель никогда не увидит chnages. –

0

Простое решение заключается в использовании POPEN() и pclose().

Функция popen(), forks() и execs() подпроцессы. Но он присоединяет подпроцессы стандартного и стандартного объекта потока, созданного popen. Таким образом, сочинительство что-нибудь к потоку в родительском посылает его к стандартному-ин суб-процессов пока ничего суб-процессы записывает в стандартный-аут может быть прочитан из потока родителем:

double value; 
FILE* child = popen("java -jar test.jar text1 text2", "r"); 
if (fscanf(child, "%f", &value) == 1) 
{ 
    fprintf(stdout,"Got Value: %f\n", value); 
} 
else 
{ 
    fprintf(stdout,"ERROR\n"); 
} 
fclose(child); 
+0

Я пробовал код, но все равно не работает. Это как-то не передает значение float из приложения jar. #include #include использование патезраса; int main() { float value; FILE * child = popen ("java -jar simmetrics_jar_v1_6_2_d07_02_07.jar text1 aab676788", "r"); fscanf (child, "% f", & value); fprintf (stdout, «Получено значение от симметрии:% f \ n», значение); fclose (ребенок); возвращение 0; } – karikari

+0

Вы проверили результат popen? Если ему не удается запустить Java-виртуальную машину или не удается найти файл jar, тогда он будет генерировать ошибку. –

Смежные вопросы