Hallo,
ich möchte in Java ein C Programm aufrufen und dessen Ausgabe wiederrum in Java verwerten. Ich bin etwas bestürzt, wie aufwendig sich die Übertragung eines einfachen shorts von C nach Java gestaltet.
Mein erster Ansatz war:
Java:
Process p = Runtime.getRuntime().exec("./Testprogramm);
System.out.println(p.exitValue());
Und in C:
short i = 257;
return i;
Es stellt sich aber heraus, dass entweder der return in C nur ein Byte ausgibt, oder der Process Object in Java nur ein Byte des return Wertes verarbeitet, wie auch immer, es kommt nur ein Byte an.
Na gut denke ich, dann muss ich eben in C printf() benutzen und dann in Java per p.getInputStream() die zwei Byte einlesen:
Java:
Process p = Runtime.getRuntime().exec("./Testprogramm);
byte[] input = new byte[2];
p.getInputStream().read(input);
Und in C:
short i = 257;
printf("%d",i);
return 0;
Aber nein, dann sind es wiederrum nicht zwei Byte, weil die Ausgabe von printf ja Zeichen für Zeichen als Character gelesen wird und somit kommen dann in Java zwischen 1 Byte und 5 Byte an, je nachdem wie viele Ziffern gerade mein short hat (bei 257 wären es dann 3).
Ok das nervt. Ich habe wirklich keine Lust noch umständlich zu prüfen wie viele Bytes tatsächlich ankamen und dann Zeichen für Zeichen die Daten irgendwie in ein Integer umbasteln.
Na fein. Einen habe ich noch. Dann zwinge ich eben C dazu wirklich genau zwei Byte auszugeben, die eben genau die Binärdarstellung von meinem short beinhalten, auch wenn es unlesbare Zeichen werden:
short i = 24930;
char *j = (char*)&i;
printf("%c%c", j[1],j[0]);
return 0;
Ich habe extra die 24930 gewählt, weil es genau die Zeichen "ab" ergibt.
Und in Java:
Process p = Runtime.getRuntime().exec("./Testprogramm);
byte[] input = new byte[2];
p.getInputStream().read(input);
int ret = (int)input[0]*256+(int)input[1];
Und so habe ich endlich meine Zahl erfolgreich überliefert. Trotzdem ist es ein ziemlicher Hack. Hat jemand einen besseren Vorschlag?
Cruz