Billie
Erfahrenes Mitglied
Ok, ich konnte das Beispiel jetzt so weit ausarbeiten, dass von Java aus die DLL geladen wird und der Systemweite-Hook gesetzt wird.
Jetzt stehe ich aber vor folgendem Problem: Die Callback-Funktion sollte ja die native Methode von Java anstoßen. Dazu benötigte ich aber vor allem einen Pointer auf ein JNIEnv-Objekt. Woher nehmen wenn nicht stehlen?!
Wenn die JVM die DLL lädt und JNI_OnLoad aufruft übergibt sie ja einen Pointer auf ein JavaVM-Objekt. Bekomm ich daraus irgendwie einen gültigen Pointer auf ein JNIEnv-Objekt, den ich mir merken kann und welchen dann die Callback-Funktion zum Aufruf der nativen Methode verwenden kann?
Jetzt stehe ich aber vor folgendem Problem: Die Callback-Funktion sollte ja die native Methode von Java anstoßen. Dazu benötigte ich aber vor allem einen Pointer auf ein JNIEnv-Objekt. Woher nehmen wenn nicht stehlen?!
Wenn die JVM die DLL lädt und JNI_OnLoad aufruft übergibt sie ja einen Pointer auf ein JavaVM-Objekt. Bekomm ich daraus irgendwie einen gültigen Pointer auf ein JNIEnv-Objekt, den ich mir merken kann und welchen dann die Callback-Funktion zum Aufruf der nativen Methode verwenden kann?
C:
// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
#include "stdafx.h"
HMODULE hmodDLL = NULL;
HHOOK hKeyboardHook = NULL;
JNIEnv *jniEnv;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
// TODO: call addGlobalKeyListener(JNIEnv *env, jclass clazz, jobject listener)
return CallNextHookEx(hKeyboardHook, code, wParam, lParam);
}
JNIEXPORT void JNICALL Java_at_co_arz_test_hook_HookExample_addGlobalKeyListener(JNIEnv *env, jclass clazz, jobject listener)
{
// From where I get a valid pointer to JNIEnv?
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc, hmodDLL, 0);
return JNI_VERSION_1_4;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hmodDLL = hModule;
return TRUE;
}