2 Stimmen

Wie man Java von C++ aus aufruft

Ich muss diese Zeile in meinem C++-Programm ausführen:

java -jar test.jar text1 text2

die Java-Anwendung gibt einen Float-Wert an das C++-Programm weiter.

Wie kann ich das tun? Ich habe noch nie eine Java-Sache aus meiner MS Visual Studio C++-Datei aufgerufen.

4voto

aJ. Punkte 33220

Wenn Sie eine starke Kopplung wünschen, verwenden Sie JNI-Wrapper .

0voto

Martin York Punkte 245363

Eine einfache Lösung ist die Verwendung von popen() und pclose().

Die Funktionen popen(), forks() und execs() führen einen Unterprozess aus. Aber sie hängt die Unterprozesse standard-in und standard-out an das von popen erzeugte Stream-Objekt. Wenn also etwas in den Stream des Elternprozesses geschrieben wird, wird es an den Standard-in der Unterprozesse gesendet, während alles, was die Unterprozesse in den Standard-out schreiben, vom Elternprozess aus dem Stream gelesen werden kann:

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);

0voto

karikari Punkte 16

Wenn ich den Java-Befehl direkt in der Eingabeaufforderung ausführe, funktioniert er, aber wenn ich den Befehl aus der C++-Datei ausführe, wird die Fehlermeldung "Das System kann das angegebene Programm nicht ausführen" angezeigt.

Hier ist mein Code, im mit 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;
}

-1voto

bua Punkte 4611

Am einfachsten ist es, wenn Sie Ihren Java-Code ändern können:

das Ergebnis in die Umgebungsvariable schreiben (Pseudocode unten):

Lösung 1. (Schreiben Sie direkt in die Umgebung der Java-Anwendung).

java:

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

exit..

c++:

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

(Ich habe es nicht getestet, aber wichtig ist hier der Kontext, erzeugt das System eine andere Shell (Konsole), wenn ja, werden Sie diese Umgebungen nicht sehen, daher ist eine andere Spawn-Methode notwendig)

CreateProcess() unter Windows fork() unter Linux.

Es gibt auch komplexere Lösungen,

  • Senden Sie einige JASONs durch die Steckdosen.... usw.
  • Schreiben in eine Textdatei in Java, Lesen in c++.
  • MPI...
  • extrem in diesem Fall CORBA ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X