Forum: PC-Programmierung Java mit C-Programm kommunizieren


von Stefan (Gast)


Lesenswert?

Hallo Zusammen,

folgendes Problem habe ich: Es soll ein C-Programm über ein Java 
Programm gesteuert werden. Das Java-Programm soll im wesentlichen die 
graphische Benutzeroberfläche realisieren und das C-Programm die 
Algorithmik im Hintergrund.

Welches ist die beste Möglichkeit für die Kommunikation der beiden 
Programme?
Es gibt in Java die Möglichkeit, ein Kommandozeilenprogramm aus Java 
heraus zu starten und via I0-Stream mit dem Programm zu kommunizieren. 
Ich habe es ausprobiert, das Programm lies sich starten, die 
Kommunikation funktionierte aber nicht.

Als zweite Möglichkeit fällt mir die Kommunikation via UDP-Server ein. 
Welche Problem könnte es bei der Kommunikation über den Localhost geben? 
Sperrt die Windows-Firewall eventuell die Kommunikation? Ist die 
Geschwindigkeit zu niedrig ?

Vielen Dank für eure Erfahrungen,
Stefan

von Peter (Gast)


Lesenswert?

warum nicht das C programm als DLL machen und von java direkt 
ansprechen?

von D. I. (Gast)


Lesenswert?

Alternativ: JNI

von Stefan (Gast)


Lesenswert?

Hmm, danke für eure Vorschläge

>warum nicht das C programm als DLL machen und von java direkt
>ansprechen?
Als C-Compiler verwende ich den GCC. Wie ich gerade gesehen haben, kann 
man damit tatsächlich DLLs erstellen:

http://www.cygwin.com/cygwin/cygwin-ug-net/dll.html

> Alternativ: JNI

Wenn ich es richtig sehe, brauch ich JNI um die DLL in Java zu laden. 
Ich bin mir nicht sicher, wie ist es mit der Datenhaltung in der DLL 
selber?

Das 2te Problem ist die Plattformunabhängigkeit: Ich will das Ganze 
sowohl unter Linux als auch unter Windows laufen lassen können.
Hier scheint es eine Library für UDP-Sockets zu geben, die 
Plattformunabhängig ist:

http://cs.baylor.edu/~donahoo/practical/CSockets/practical/

Die Frage wäre, wie zuverlässig kann so was sein?

von Stefan (Gast)


Lesenswert?

Der Link für das JNI-Example:
http://patriot.net/~tvalesky/jninative.html

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stefan schrieb:
> Das 2te Problem ist die Plattformunabhängigkeit: Ich will das Ganze
> sowohl unter Linux als auch unter Windows laufen lassen können.
Du kannst die "DLL" sowohl für Win als auch für Linux kompilieren.

> Welche Problem könnte es bei der Kommunikation über den Localhost geben?
Über UDP vorallem das Pakete verloren gehen, Protokolloverhead, 
Serialisierung/Deserialisierung...

> Das 2te Problem ist die Plattformunabhängigkeit
Warum nicht einfach alles in Java schreiben?

von Stefan (Gast)


Lesenswert?

>> Welche Problem könnte es bei der Kommunikation über den Localhost geben?
>Über UDP vorallem das Pakete verloren gehen, Protokolloverhead,
>Serialisierung/Deserialisierung...

Hmm, ja, da hast Du recht. Es hätte aber den Vorteil, dass man viele 
unabhängige Instanzen laufen lassen kann.

Ich habe gerade mal ein wenig mit dem JNI-Interface herumprobiert. Wow, 
was für ein kompliziertes fehleranfälliges Verfahren. Aus dem 
Zusammenfügen verschiedenster Information aus verschiedenen Websites ist 
es mir endlich gelungen, ein JNI Beispiel zu kompilieren.
Der wichtigste Hinweis war hier:
http://www.inonit.com/cygwin/jni/helloWorld/c.html

>> Das 2te Problem ist die Plattformunabhängigkeit
>Warum nicht einfach alles in Java schreiben?

Weil ich schon eine riesigen Batzen in C geschrieben habe. Ich schreibe 
einen Prozessoremulator und der ist in Java zu langsam. Außerdem ist der 
Byte-Typ in Java Mist für Bitmanipulationen. Da lobe ich mir die 
inttypes in C.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stefan schrieb:

> Ich habe gerade mal ein wenig mit dem JNI-Interface herumprobiert. Wow,
> was für ein kompliziertes fehleranfälliges Verfahren.
Also ich habe mit JNI schon ab und an mal gearbeitet, was ist daran 
fehleranfällig? C ist fehleranfällig, ja aber das wolltest du doch!

>>Warum nicht einfach alles in Java schreiben?
>
> Weil ich schon eine riesigen Batzen in C geschrieben habe.
Naja... Das eben in Java zu transformieren macht dadurch das du es 
später viel einfacher hast um ein vielfaches wieder wett.
> Ich schreibe einen Prozessoremulator und der ist in Java zu langsam.
Behaupte ich einfach mal das das so nicht stimmt. Hast du schon tests 
gemacht?
> Außerdem ist der Byte-Typ in Java Mist für Bitmanipulationen.
Wieso dass? das funktioniert einwandfrei. Wenn es dir um das vorzeichen 
geht must du halt auf char oder int gehen. Bitmanipulationen sind in 
Java (egal welcher Typ) genauso einfach wie in C oder jeder anderen 
Programmiersprache.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.