Java/C++ interop - JNI oder TCP oder ?



  • Hallo zusammen,

    ich habe eine Software mit graphischer Oberfläche in C++ unter Verwendung von Qt geschrieben, die noch um eine Bluetoothverbindung zu einem Lego Mindstorms NXT erweitert werden muss. In Java habe ich eine fertige Bibliothek dafür und jetzt überlege ich mir, wie ich am besten java code von c++ aus nutzen kann. Ich vermute mal, dass direktes aufrufen von java-Methoden aus C++ nicht möglich sein wird, da ja erst eine JVM laufen muss. Mir sind 2 Möglichkeiten bekannt, die ich nutzen könnte:
    1 Möglichkeit: Das Programm von Java aus starten und per JNI (Java Native Interface) den C++-Teil der Software starten und in java alles was mit bluetooth zu tun hat machen. Der C++-Teil sollte dann einen neuen Thread starten und darin seperat weiterlaufen. Wird etwas empfangen per Bluetooth oder gibt es eine Statusänderung, dann wird eine C++-Funktion aufgerufen. Will der C++-Teil etwas senden, dann - thoah das ist ein wenig problematisch. Vorstellen könnte ich mir, das zu sendende in eine queue zu packen und mit dem java-teil des programms periodisch zu pollen, ob etwas in der queue liegt - gibt es da vielleicht bessere ansätze?
    2 Möglichkeit: 2 Eigenständige Anwendungen (Java und C++) schreiben, die per TCP kommunizieren (die java-anwendung schickt an c++, was empfangen wurde und statusänderungen und die c++-anwendung schickt an java, was gesendet werden soll).

    Alternativ könnte man auch darüber nachdenken eine C++ Bluetooth-Bibliothek zu bemühen, aber ich habe Zweifel daran, dass das richtig zusammen mit den NXT's funktioniert. Dafür gibt es für java ja extra eine spezielle Bibliothek.

    Was meint ihr? Gibt es vielleicht noch mehr Möglichkeiten (evtl. doch java-code von c++ aus aufrufen?)



  • Wie wäre es wenn das java-Programm die Nachrichten die es verschicken soll auf der Standardeingabe kriegt und dann per bluetooth weiterverschickt? Dann müsstets du nur noch das Javaprogramm aufrufen und die Nachrichten in stdin reinschreiben



  • Ist standardeingabe == konsole, oder meinst du, dass ich das irgendwie umlenken soll?

    Ich muss sowohl etwas empfangen als auch etwas senden.

    Wenn ich das zu Sendende in die konsole eintippen muss, dann bringt mir das ganze nichts.

    Ich habe gerade noch gelesen, dass JNI es auch ermöglicht java code von nativem code aufzurufen, hab mir aber noch ncihtso genau angeguckt, wie das geht.

    Im moment tendiere ich aber zu tcp, weil ich vermute, dass das mit JNI etwas aufwändig sein könnte.



  • Er meint wohl, dass du stdin und stdout pipen sollst. Klingt sinnvoll und einfach.



  • Wie funktioniert das denn?
    Kann ich dann jeweils die standardein/ausgabe der beiden programm über kreuz ineinanderpipen?
    Bisher habe ich in die Richtung nur mal die Ausgabe einer Datei in ein File umgeleitet durch starten mit der Konsole:

    Test.exe > out.txt
    

    Und die Qt-Applikation hat gar keine Konsole, kann ich das mit dem pipen dann trotzdem machen?

    Edit: Mit google hab ich erstmal nur allgeimeinere infos gefunden. Wie ich das jetzt konkret umsetzen kann, hab ich noch nicht so ganz raus. Wäre gut, wenn ihr mir das nochmal erklären könnt.

    Vielen Dank für Eure Hilfe!



  • Unter nem Unix würde in C++ zuerst mit 2 mal pipe() 2 Pipes erstellen, danach mit fork() den Prozess kopieren, mit dup2() die Pipes auf stdin/stdout umbiegen und danach mit execl() das Java-Programm ausführen.

    Unter Windows habe ich keine Ahnung, da ich dafür nicht entwickle.



  • 314159265358979 schrieb:

    Unter Windows habe ich keine Ahnung, da ich dafür nicht entwickle.

    Schade, ich entwickel nämlich für windows.
    Ich werd dann nochmal ein bischen google bemühen.
    Wo liegen denn dann die vorteile im vergleich zu "normalem" tcp?



  • Ich würde sagen, es ist einfacher zu verwenden, mehr aber nicht. Möglicherweise ists etwas schneller, aber das wird wohl nicht bemerkbar sein.



  • Weißt du denn wie es auf der Java-Seite funktioniert? Java rühmt sich doch immer so mit seiner Plattformunabhängigkeit, dann hoffe ich einfach mal, dass das bei windows und unix gleich ist.

    Edit: Evtl. wärs sinnvoll den thread nach winapi zu verschieben, was meint ihr?
    Edit2: Hab gerade das hier bei qt entdeckt:

    The QLocalSocket class provides a local socket.
    On Windows this is a named pipe and on Unix this is a local domain socket.

    Werds mir jetzt mal genauer anschaun.
    Edit3: Sieht eher danach aus, dass das nur mit QLocalServer zusammenarbeitet und dann wahrscheinlich nicht mit Java 😞



  • Q schrieb:

    Weißt du denn wie es auf der Java-Seite funktioniert?

    http://download.oracle.com/javase/6/docs/api/java/net/Socket.html



  • Q schrieb:

    Und die Qt-Applikation hat gar keine Konsole, kann ich das mit dem pipen dann trotzdem machen?

    Unter Windows und Linux bseitzt jede ausführbare Datei automatisch drei Streams: Eingabe, Ausgabe und Fehlerausgabe.

    Eine minimale Konsole ist ein sehr einfaches Stück Software, sie macht folgendes, wenn du in ihr ein Programm P ausführst:
    - Die Konsole startet Programm P
    - Alles was in die Konsole eingetippt wird, wird P in die Eingabe geschrieben
    - Alles was von P in Ausgabe und Fehlerausgabe geschrieben wird, stellt die Konsole dar
    Dazu leitet die Konsole diese Datenströme um, mit dem "pipen" kann man den Ausgabestrom eines Programms mit dem Eingabestrom eines anderen verbinden.

    Siehe auch Wikipedia.


Anmelden zum Antworten