JNI: Mit Java Daten holen die mit C++ empfangen wurden...



  • Hi,
    ich habe ein C++ Prog welches über eine Connection Daten empfängt und diese in einem Struct sammelt. Nun muss ich aber mit Java an diese Daten ran. Das Problem ist ich brauche ja ein laufendes Prog(exe) um die COnnection zu ahlten und die Daten zu empfangen, aber für JNI brauche ich eine DLL. Wie komme ich denn dann über die DLL an die Daten die mit der exe empfangen werden?

    MfG Baweg



  • Du könntest dafür Shared/Mapped Memory verwenden. Dabei sollte allerdings sichergestellt werden, dass du Daten nicht überschreibst bevor diese ausgelesen wurden.
    Dazu wäre das OS welches du benutzt gut zu wissen. Für Windows guck dir mal folgende Funktionen an: CreateFile, CreateFileMapping, MapViewOfFile, UnmapViewOfFile, CloseHandle.



  • ja die PLatform ist Windows.
    Also benutze ich son Shared Memory zwischen Dll und Exe!?

    Und gleich mal die Frage wie man sowas anstellt. Im Internet find ich keine Beispiele....



  • Das sollte kein Problem sein Shared Memory zwischen DLL und Exe zu nutzen. Obwohl dann die Frage ist, wenn die DLL von der Exe verwendet wird, ob man die struct nicht einfach übergeben kann mit einem Funktionsaufruf oder so.

    Musst mal bissl google bemühen und als Stichwort u.a. C++ verwenden. Habe mal nur nach Shared Memory C++ (kannst ja sonst auch nochmal Mapped Memory C++ ausprobieren) gegooglet und hier was gefunden, vllt. hilft's etwas:
    http://www.c-plus-plus-archiv.de/forum/show.ca/message/15204/
    Hier kannst du auch nochmal gucken, da gibts eine Demo-Anwendung die wohl Shared Memory verwendet:
    http://www.schikos.de/MFC.html

    Auf Boost konnte man vor einiger Zeit auch lesen, dass es dort wohl bald auch eine entsprechende Bibliothek für Shared Memory geben wird:
    http://lists.boost.org/boost-announce/2006/02/0082.php
    http://lists.boost.org/boost-announce/2006/02/0083.php

    Greetz



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wie soll ich dass denn mit nem Funktionsaufruf an die DLL übergeben?

    Kann ich einfach in der DLL ne Funktion haben die ich aufrufe und die dann einen Pointer auf das Struct setzt? oder muss ich eine Kopie vom gesamten Struct dann in der DLL erstellen? Aber das wär sehr speicherlastig da ich auch mehrere structs in einem vector zsuammenfasse und das könnten schon mal 100 structs mit jeweils 20 Daten werden.Wäre ja blöd das zweimal im Speicher abzulegen oder?



  • 100 structs * 20 Daten * ca. 4 Bytes = 8 Kilobyte. Schadet definitiv nicht, das im Speicher doppelt zu haben. Andere Lösungen sind schöner, aber 8 KB mehr oder weniger sollten heutzutage keinem Nutzer mehr weh tun 😉

    Wenn ich auch mal ne Frage beispenden darf: Mit GlobalAlloc kann man ja Speicher reservieren. Mit dem Flag GMEM_FIXED verändert sich der Speicherbereich auch nicht. Wenn ich den Pointer an eine andere Anwendung (oder Dll) übergebe, kann die doch damit nichts anfangen, oder? Ist es nicht so, dass jede Anwendung ihren eigenen Addressspeicher hat und eine externe Anwendung muss da irgendwie anders addressieren?
    Kann ich den Pointer von Global/LocalAlloc einfach an andere Anwendungen zur Benutzung übergeben (oder auch Stack-Pointer)?? Hab im Hinterkopf, dass es nicht ging, aber mein Hinterkopf ist sich da nicht so ganz sicher...
    Also?
    Und btw: Wie funktioniert eigentlich DDE? 😃



  • Nagut wenns egal ist...

    Aber ich müsste auch von Java aus eine Message üver die C++ Connection schicken. Wie soll cih das denn machen? Ich kann nur eine Function in der DLL aufrufen und wie will die FUnction in der DLL dann was über die Connection in der Exe schicken?

    Kann man aus der DLL eine Funktion der EXE aufrufen?



  • Gibts keine Möglichkeit das zu Verwirklichen?

    Sonst ne Möglichkeit von Java aus an die Daten zu kommen und die Daten zu versenden?



  • Aus der DLL kannst du keine Funktion aus der Exe aufrufen, nein.
    Aber es gibt mehrere Möglichkeiten, zwischen 2 Programmen zu kommunizieren (wobei ich mir bei den ganzen Möglichkeiten selber nicht so sicher bin...):
    - DDE
    - Pipes
    - Eine Datei als Schnittstelle

    Bin da nicht so der Master, vielleicht weiß da jemand mehr?



  • Also ich hab mal alles in die DLL egschrieben. Also dort wird nun auch der CDialog erstellt und die Connection dann aufgebaut.

    Wollte das mal testen indem ich ein C++ Prog schreibe wo ich nur die DLL aufrufe aber irgendwie erstellt der den Dialog dann nicht? Muss das Prog dann auch ne MFC-Anwendung sein oder reicht es dass die DLL eine MFC-DLL ist?
    Ich habe dann einfach mit __declspec( dllimport ) die DLL importiert und eine Funktion namens init8) aufgerufen die dann eigentlich den Dialog erstellen soll aber es passiert nix...


Anmelden zum Antworten