Zum Inhalt springen

Java in C einbinden


deathais

Empfohlene Beiträge

Hallo!

Ich arbeite zur Zeit an einem Projekt, bei dem es darum geht ein Java-Programm für C nutzbar zu machen. Ursprünglich war es mein Plan, das Programm einfach komplett von Java nach C umzuschreiben, doch es hat sich herausgestellt, dass das Programm nicht - wie angenommen - ca. 100 Zeilen, sondern ca. 9000 Zeilen hat und zudem stark objektorientiert geschrieben ist

Meine derzeitige Idee ist es deshalb, eine Art Interface zu schreiben oder auf irgendeine andere Art und Weise aus einem C-Programm auf das Java-Programm zuzugreifen. Vorstellbar wäre z.B. etwas wie, dass das C-Programm gestartet wird, es im Verlauf einmal oder mehrfach das Java-Programm aufruft, welches Daten in eine Datei schreibt, die später von dem C-Programm wieder ausgelesen werden.

Daran, dass die Daten letztlich von einem Programm in C verarbeitet werden, führt leider soweit ich das sehe kein Weg vorbei, da es sich hierbei um ein größeres Projekt handelt, das in C verfasst ist.

Da ich leider nicht so versiert bin, was fortgeschrittenere Programmierkünste angeht, würde ich gerne wissen, ob sowas

a) überhaupt möglich ist und

B) wie zum Beispiel ;-)

Ich habe etwa einen Monat Zeit, also durchaus genug, um mich irgendwo einzulesen.

Es soll auf Unix-Betriebssystemen laufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mir ist kein Weg bekannt nativ unter C Java Code auszuführen. Eine Möglichkeit wäre nur aus C die Java VM inkl Java Klassen zu starten, wenn ein Shell-Commando möglich ist. Ist aber sehr unschön

Aus Java C aufrufen geht mit JNI. Da Du aber ja vor hattest das ganze zu portieren, würde ich Dir zu C++ raten, letztendlich könntest Du einfach die Java Klassen in C++ Klassen bzw Templates übersetzen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, es besteht die Möglichkeit heraus direkt aus C bzw. C++ eine Java Virtual machine zu starten und von dort aus - wie gewohnt - Java-Code ausführen zu lassen. Die Stichworte für die Suchmaschine deiner Wahl heissen "java invocation api".

Wirklich Spaß machen tut das aber nicht.

Meines Wissens nach kann man doch Java-Code kompilieren. (Also nicht wie üblich *.jar sondern *.exe/*.dll).
Du weisst, wie das Kompilieren bei Java funktioniert? Du weisst, wie der Code ausgeführt wird (Stichwort Virtual Machine)? Scheinbar besteht da noch ein wenig Nachholbedarf.

Natives Kompilieren ist auch mit Java Code möglich (gcj kann sowas zum Beispiel) allerdings ist das nicht so einfach, wie man sich das vorstellt. Java lebt davon in einer Virtual Machine ausgeführt zu werden - die gesamte Speicherverwaltung lebt davon und etliche andere Dinge (Stichwort HotSpot) ebenso.

Wenn ich alles das in ein einziges Executable packe muss jedes einzelne Executable eine eigene VM mitbringen, damit das ganze überhaupt funktioniert. Kurzum: Nicht wirklich schön und der Performance alles andere als zuträglich. Für Experimente ganz nett aber für den produktiven Einsatz würde ich da die Finger vonlassen.

Ist aber nur eine Vermutung.
Vermutungen sind in solchen Themen immer toll. Besonders wenn man sie durch ein wenig eigene Recherche eigentlich ganz einfach bestätigen/widerlegen könnte. :rolleyes:
Link zu diesem Kommentar
Auf anderen Seiten teilen

Du weisst, wie das Kompilieren bei Java funktioniert? Du weisst, wie der Code ausgeführt wird (Stichwort Virtual Machine)? Scheinbar besteht da noch ein wenig Nachholbedarf.

Ja, mein letztes Java-Projekt ist zwar schon bisschen her, aber bisschen was ist hängen geblieben, wenn ich das richtig in Erinnerung hab, wird die "komplette VM" mit kompiliert.

Natives Kompilieren ist auch mit Java Code möglich (gcj kann sowas zum Beispiel) allerdings ist das nicht so einfach, wie man sich das vorstellt. Java lebt davon in einer Virtual Machine ausgeführt zu werden - die gesamte Speicherverwaltung lebt davon und etliche andere Dinge (Stichwort HotSpot) ebenso.

Wenn ich alles das in ein einziges Executable packe muss jedes einzelne Executable eine eigene VM mitbringen, damit das ganze überhaupt funktioniert. Kurzum: Nicht wirklich schön und der Performance alles andere als zuträglich. Für Experimente ganz nett aber für den produktiven Einsatz würde ich da die Finger vonlassen.

gcj hatte ich jetzt weniger im Sinn, eher solche Sachen wie Jet, da ist lt. Featureliste die RAM-Belastung auch weniger als bei der java.exe. Die Performance wird dort auch als "besser" angepriesen.

Vermutungen sind in solchen Themen immer toll. Besonders wenn man sie durch ein wenig eigene Recherche eigentlich ganz einfach bestätigen/widerlegen könnte. :rolleyes:

Vermutungen in solchen Themen sind nur etwaige Lösungsvorschläge, da mir mein Unterbewusstsein verbietet eine plattformunabhängige Sprache zu kompilieren. :floet:

Oder kurz: Ich war zu faul zum Googlen und hab nur paar Stichwörter gegeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

gcj hatte ich jetzt weniger im Sinn, eher solche Sachen wie Jet, da ist lt. Featureliste die RAM-Belastung auch weniger als bei der java.exe. Die Performance wird dort auch als "besser" angepriesen.
Da bin ich vorsichtig und ohne konkreten Anwendungsfall ist das sicher sehr hoch gegriffen was Versprechungen angeht. Ich glaube durchaus, dass es in der typischen Wald und Wiesenapplikation keinen großen Unterschied macht ob ich vorkompilierten Code habe oder Hotspot dynamisch nachoptimiert. Dennoch: Man muss sich darüber bewusst sein.

Vermutungen in solchen Themen sind nur etwaige Lösungsvorschläge, da mir mein Unterbewusstsein verbietet eine plattformunabhängige Sprache zu kompilieren.
Das ist doch einfach nur das Etikett, was ich draufklebe. In einfachen Programmen ist auch C plattformunabhängig. Trotzdem wird es direkt nativ kompiliert. Gleiches gilt für Pascal.

Man muss sich halt überlegen, was man mit dem nativen Kompilieren erreichen möchte. Oftmals ist es bei Java nur so, dass manch einer eine exe Datei haben will, die mit einem Doppelklick gestartet werden kann. Dafür benötige ich aber keine native Kompilierung sondern nur einen kleinen Launcher. Ebenso gibt es andere Einsatzbereiche wo es andere Lösungen geben kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist doch einfach nur das Etikett, was ich draufklebe. In einfachen Programmen ist auch C plattformunabhängig. Trotzdem wird es direkt nativ kompiliert. Gleiches gilt für Pascal.

Da muss es aber schon seeeeeeeehr einfach sein. :rolleyes:

Meines Wissens nach kannst man normale C-Projekte (auch wenn man sich 100%ig an den Standard hält), nicht ohne Neukompilieren in anderen Systemen zum Laufen bringen. Der Code ist zwar standardisiert und lässt sich unter Linux genauso wie unter Windows ohne Fehler übersetzen, dennoch wird die nicht funktionieren.

(Einfachstes Beispiel ist sicher das Dateihandling.)

Ich glaube aber so und so nicht, dass es mit C möglich sein könnte, ein Sprachanbindung zu etablieren, wenn dann C++.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meines Wissens nach kannst man normale C-Projekte (auch wenn man sich 100%ig an den Standard hält), nicht ohne Neukompilieren in anderen Systemen zum Laufen bringen.
Das ist richtig. Binärkompatibel ist der Output nicht. Wenn man ganz erbsenzählerisch werden möchte und die Begriffsdefinition sehr scharf auslegen möchte ist eine plattformunabhängige Sprache wie Java das aber auch nicht. Wieso? Die Virtual Machine, die ich zur Ausführung benötige ist auch wieder plattformspezifisch und muss für jede Plattform kompiliert werden.

Wie gesagt: Sehr erbesenzählerisch und sicher nicht das, was man gemeinhin darunter versteht aber jeder, der Plattformunabhängigkeit als Pro- oder Contra-Argument anführt sollte halt immer genau wissen bzw. definieren, was er darunter genau versteht.

Aber ein Programm wie


 int main() {

   cout << "Hellol World" << endl;

   return 0;

 }

lässt sich ohne Probleme auf jeder Plattform kompilieren und dort ausführen.

Ich glaube aber so und so nicht, dass es mit C möglich sein könnte, ein Sprachanbindung zu etablieren, wenn dann C++.
Was genau? Eine Sprachanbindung "Java von C aus aufrufen" (um auchmal wieder den Bogen zurück zum Ursprungsthema zu ziehen)? Doch, die ist auch mit "purem" C möglich. Streng genommen werde da ja auch nur Funktionen aus der jvm.dll (bzw. den ensprechenden Linux-Pendants) aufgerufen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Was genau? Eine Sprachanbindung "Java von C aus aufrufen" (um auchmal wieder den Bogen zurück zum Ursprungsthema zu ziehen)?

Ich möchte dazu noch einmal in den Raum werfen, ob es nicht sinnvoller ist, da der Code in Java vorliegt diesen anstatt in C in C++ zu übersetzen. Denn egal ob C oder C++ Code, als Ergebnis steht ein Binary. Die Javaklassen lassen sich relativ gut übersetzen und mit Hilfe der Boost kann der Code so designed werden, dass man ihn auch auf unterschiedlichen Plattformen kompilieren kann

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist richtig. Binärkompatibel ist der Output nicht. Wenn man ganz erbsenzählerisch werden möchte und die Begriffsdefinition sehr scharf auslegen möchte ist eine plattformunabhängige Sprache wie Java das aber auch nicht. Wieso? Die Virtual Machine, die ich zur Ausführung benötige ist auch wieder plattformspezifisch und muss für jede Plattform kompiliert werden.

Das mag richtig sein, jedoch liegt die Java-Anwendung ja als Byte- und nicht Binärcode vor, dass man dafür dann einen spezifischen Interpreter braucht ist klar, aber das Programm ist (da nicht Binär- sondern Bytecode) unabhängig von der Plattform (wenn keine HACKs drin sind) und muss bei anderen Plattformen nicht neu übersetzt werden.

Aber ein Programm wie


 int main() {

   cout << "Hellol World" << endl;

   return 0;

 }

lässt sich ohne Probleme auf jeder Plattform kompilieren und dort ausführen.

Bist du dir da sicher? Der Typ Integer ist, soviel ich weiß, nirgendswo mit einer festen Größe definiert und ich könnte mir vorstellen, das die Kompilierung unter BigEndian und die Ausführung unter LittleEndian irgendwann in einen Fehler läuft. Desweiteren gibt es, zumindest unter Microsoft, im cout auch noch interne Variablen (die meist mit Unterstrich anfangen), bei denen nicht sicher gestellt ist, dass sie auf jedem System laufen (und die auch nicht im Standard definiert sind, soweit ich weiß).

Was genau? Eine Sprachanbindung "Java von C aus aufrufen" (um auchmal wieder den Bogen zurück zum Ursprungsthema zu ziehen)? Doch, die ist auch mit "purem" C möglich. Streng genommen werde da ja auch nur Funktionen aus der jvm.dll (bzw. den ensprechenden Linux-Pendants) aufgerufen.

"Nicht möglich" war vielleicht die falsche Formulierung, ich halte es aber auf jeden Fall für umständlicher. Das Laden einer Klasse aus einer Datei funktioniert in meinen Augen deswegen nicht, weil C keine Klassen kennt und man dann nicht weiß, wie man Methoden aufrufen bei so einer strengen OOP-Sprache aufrufen soll. Deswegen eher C++. Wie flashpixx schon sagte, noch etwas boost mit rein und dann ist es plattformunabhängig kompilierbar. (Da es aber eh nur auf UNIX laufen soll, ist das ja erstmal zweitrangig. ;))

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...