Variablen-Übergabe Java <-> C++
-
In meinem C++ Programm führe ich eine java.class Datei über die CreateProcess function aus. Im Detail:
// define a pointer to directory with Main.class file
char * pExecute = "java Main";// create a java interpreter process
if( !CreateProcess( NULL, // No module name (use command line).
pExecute, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
CREATE_NEW_CONSOLE,
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
TRACE( "CreateProcess for Execute failed (%d).\n", GetLastError() );
return;
}Die Java-Klasse Main.class ist die kompilierte Klasse des Codes:
public class Main {
public Main() {
}public static void main(String[] args) {
try{MCDVersion pMCDVersion = new MCDVersion();
int minor = pMCDVersion.getMinor();} catch (com.inzoom.comjni.ComJniException e){
System.err.println("Exception: "+e.getMessage());
}}
}Offensichtlich gibt die Main.class ein Integer "int minor" zurück. Die Frage ist nun: Wie kann ich dieses Integer an meinen C++ code zurückgeben, so dass C++ diesen Wert weiter benutzen kann?? Der Javacode sollte nicht geändert werden. Gibt es Ideen??
-
Du musst das Pferd andersrum aufzaeunen.
Benutz JNI und schreib ein C++-Plugin fuer Java, das Dir Java-Klassen zur Verfuegung stellt, die Du von Java aus benutzen kannst. Schau Dir mal Sun's JNI Tutorial an.
Hast Du das erstmal geschafft, ist der Rest einfach: Von Deinem C++ Programm aus startest Du das Java-Programm und kommunizierst per IPC (Interprozesskommunikation) mit dem Java-Programm. Dafuer kannst Du z.B. Named Pipes oder Sockets verwenden.
Installier Dir den Platform SDK von Microsoft, falls Du ihn noch nicht hast, und lies Dir die Kapitel ueber Interprozesskommunikation durch.
Uebrigens, mit reinem C++ hat das hier nix zu tun, gell! :p
-
Power Off schrieb:
Uebrigens, mit reinem C++ hat das hier nix zu tun, gell! :p
in welches forum soll ich's verschieben?
-
volkard schrieb:
in welches forum soll ich's verschieben?
Java.
-
Damit hats wohl mehr zu tun, oder wat?
-
Ja -- In Java ist JNI-Programmierung eher an der Tagesordnung. Es gehoert sogar zum Sun Standard-Tutorial fuer Java-Programmierung.
Wahrscheinlich, falls meine Antwort ihn noch nicht ueberzeugt hat, findet widmerts dort eher Hilfe.
-
Ich habe die Frage so verstanden, dass nicht JNI gewünscht ist, also in einem Java-Programm native Funktionen, sondern in einem native Programm Java-Methoden aufzurufen.
Dies ließe sich IMHO mit Remote Method Invocationen machen, allerdings weiß ich beim besten Willen nicht, wie man das von C++ aus macht. RMI ist allerdings das Mittel der Wahl um Methoden eines Programms aufzurufen, das in einer VM läuft, in der nicht das eigene Programm läuft.
Sehr viele andere Möglichkeiten kann ich mir nicht vorstellen.