JNIEnv Pointer in nativer Dll herausbekommen

javaprogger1987

Erfahrenes Mitglied
Hallo!
Ich hab folgendes Problem:
Ich versuche eine Schnittstelle für Hotkeys zu erzeugen indem ich mit JNI und Hooks arbeite..
Soweit so gut, ich würde nun gerne von der DLL ein Callback nach Java erzeugen.. So ein Callback ist auch kein Problem, wenn ich einen funktionierenden JNIEnv* Pointer habe..
Diesen Pointer bekommt man ja bei jedem Aufruf einer C-Methode von Java aus mitgegeben, ein "Rückruf" mit diesem Pointer funktioniert auch wunderbar:
C:
JNIEXPORT jboolean JNICALL Java_keyhook_HotKeyManager_installHook
  (JNIEnv *env, jobject clazz, jint nrOfHooks)
  {
          jclass jclazz;
          jmethodID mId;
          jclazz = env->GetObjectClass( clazz );
          mId = env->GetMethodID( jclazz, "jniActionPerformed", "(III)V" );
          env->CallVoidMethod( clazz, mId, (jint) 10, (jint)0, (jint)0 );  //<-------- Klappt!
          return (jboolean) InstallHook( (int)nrOfHooks, env, clazz, mId );
  }
Nach Abschuss der Methode InstallHook (dort wird der Hook gesetzt), wird diese Methode auch ganz normal beendet.
Wenn ich aber nun versuche den Pointer nach(!) dem Ende dieser Methode zu benutzten klappt gar nichts mehr - ich denke mal es hängt damit zusammen:
The JNI interface pointer (JNIEnv) is valid only in the current Thread.(http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/invocation.html#wp1060)

Nun habe ich auch schon probiert das mit AttachCurrentThread zu lösen, allerdings hat das den gleichen Effekt, nämlich das der damit ermittelte Pointer zwar während dem Ablauf der Methode gülitg ist, aber sobald ein Callback vom Systemhook kommt nicht mehr funktioniert.. Auszug aus InstallHook
C:
    JavaVM *vm;
jint res = (*env)->GetJavaVM(env, &vm);
res =(*vm)->AttachCurrentThread( vm, (void**)&jniEnv, NULL );
(*jniEnv)->CallVoidMethod( jniEnv, jniClass, jniMId, (jint) 10, (jint)0, (jint)0 ); //<---Geht noch

Hoffe jemand weiß Rat :D
Gruß
Tobias
 
Zuletzt bearbeitet:
Zurück