Как позвонить в Java из C ++ - PullRequest
2 голосов
/ 06 апреля 2010

Мне нужно запустить эту строку из моей программы на С ++:

java -jar test.jar text1 text2

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

Как я могу это сделать? Я никогда раньше не вызывал java из моего файла MS Visual Studio C ++.

Ответы [ 4 ]

4 голосов
/ 06 апреля 2010

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

0 голосов
/ 07 апреля 2010

Когда я запускаю команду 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;
}
0 голосов
/ 06 апреля 2010

Простое решение - использовать popen () и pclose ().

Функция popen (), forks () и execs () a обрабатывает подпроцессы. Но он присоединяет подпроцессы стандартного и стандартного потокового объекта, созданного 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 голосов
/ 06 апреля 2010

Проще всего, если вы можете изменить свой код Java:

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

решение 1. (Написать прямо в env. В приложении Java.)

Java:

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

exit..

C ++:

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

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

CreateProcess () в Windows fork () в Linux.

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

  • отправьте несколько ДЖЕЙСОНОВ через сокеты ... и т. Д.
  • Запись в текстовый файл в Java, читать в C ++.
  • MPI ...
  • экстрим в данном случае CORBA;)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...