Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Java » JNI - Aufruf einer Javaroutine von C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.03.2006, 00:25 Uhr
Neubauer



Ich hoffe, ich treffe einigermaßen das richtige Forum

In meinem Bestreben für Java Global Hotkeys zu registrieren bin ich in C++ jetzt soweit, dass ich von Java über JNI Global Hotkeys registrieren kann bei deren betätigen eine C++-Methode aufgerufen wird. Selbige soll eine Javamethode aufrufen, was aber noch nicht klappt. Und da liegt mein Problem. Es soll also folgende Abfolge funktionieren:

- Java-Programm wird gestartet
- Aufruf einer C++-Nativeroutine per JNI, die die Hotkeys registriert
- Bei Betätigen eines Hotkeys wird eine C++-Routine ausgeführt.

Problem: Selbige soll die gleiche Klasse, die ganz am Anfang die Hotkeys registriert hat erreichen und dort eine Routine aufrufen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.03.2006, 10:46 Uhr
~Karahead|work
Gast


Ähhm, Was genau ist nun deine Frage? Ich versteh noch nicht so ganz wo dein Problem liegt?

Gibt es konkrete Fehler oder hast du eine Design Frage?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.03.2006, 10:49 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Neubauer:

- Java-Programm wird gestartet
- Aufruf einer C++-Nativeroutine per JNI, die die Hotkeys registriert
- Bei Betätigen eines Hotkeys wird eine C++-Routine ausgeführt.

Problem: Selbige soll die gleiche Klasse, die ganz am Anfang die Hotkeys registriert hat erreichen und dort eine Routine aufrufen.



Ich denke, du solltest einfach im ersten Schritt Dein Object anlegen, in einer globalen Variable speichern und dann beim Betätigen der Hotkeys darauf zugreifen.
Möglichkeit 2 besteht natürlich darin, daß du bei "- Aufruf einer C++-Nativeroutine per JNI, die die Hotkeys registriert
" ein Object erstellst und in die Javawelt zurückgibst und dann bei "- Bei Betätigen eines Hotkeys wird eine C++-Routine ausgeführt. " dieses Object mit als parameter zurücklieferst,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 13.03.2006 um 10:50 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.03.2006, 09:24 Uhr
Neubauer



Vielen Dank schon mal für die Antworten. Leider bin ich noch nicht weiter gekommen.

Hier mal das Beispiel:


C++:
#include "MathFuncsDll.h"
#include <conio.h>
#include <stdio.h>
#include "hotkeyhandler.h"

    void OnHotKey(void *)
    {    
            // Invoke Java Function
    }

    
    CHotkeyHandler hk;
    JNIEXPORT void JNICALL Java_gui_Gui_activateGlobalHotkeys
    (JNIEnv * env, jobject obj) {

        int err, id;
           hk.RemoveHandler(id = 0);
        hk.InsertHandler(MOD_CONTROL | MOD_ALT, 'A', OnHotKey, id);

        err = hk.Start("calc.exe");
        if (err != CHotkeyHandler::hkheOk)
        {      
            printf("Error %d on Start()\n", err);
        }                
    };

    JNIEXPORT void JNICALL Java_gui_Gui_deactivateGlobalHotkeys
    (JNIEnv * env, jobject obj) {
        int err = hk.Stop();
    }



In OnHotKey soll sozusagen die Java-Methode aufgerufen werden und zwar von der JVM, die früher die activateGlobalHotkeys aufgerufen hat. Ich habe es probiert in dem ich global die JNIEnv Information speichere und in OnHotKey darauf zurückgreife, aber dann bekam ich Laufzeitfehler, die irgendwas mit Zugriff zu tun hatten.

Mir ist klar, dass da auch irgendwie noch ein Threadproblem vorhanden ist, da ja die JVM nach Aktivierung der global hotkeys weiter läuft und man ja versucht wieder darauf zurückzugreifen. Es gibt da wohl die Möglichkeit mit attachthread zu arbeiten, aber das habe ich noch nicht hinbekommen. Das Problem ist eine Methode in der JVM anzustoßen, die währenddessen trotzdem weiterläuft und ja auch andere Events von Benutzern animmt.

Hat da jemand eine Idee? Vielleicht auch Codefragmente ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Java ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: