JVM , JNIEnv . .
Sun JNI .
, :
JNI_OnLoad. . JavaVM, . (*env)->GetJavaVM initializeJNIVars, .
initializeJNIVars obj, Obj = (*env)->NewGlobalRef(obj).
LowLevelKeyboardProc env:
AttachCurrentThread(JavaVM *jvm, JNIEnv &env, NULL);
Edit
, , , , , . NB: , , , .
:
static JavaVM *javaVM = NULL;
static jmethodID callbackMethod = NULL;
static jobject callbackObject = NULL;
cls, mid, env obj .
JNI_OnLoad, JavaVM:
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
JNIEnv *env = 0;
if ((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4)) {
return JNI_ERR;
}
javaVM = jvm;
return JNI_VERSION_1_4;
}
initializeJNIVars :
void Java_keylogger_TestKeys_initializeJNIVars(JNIEnv *env, jobject obj) {
jclass cls = (*env)->GetObjectClass(env,obj);
callbackMethod = (*env)->GetMethodID(env, cls, "callBack", "(Ljava/lang/String;)V");
callbackObject = (*env)->NewGlobalRef(env, obj);
if(cls == NULL || callbackMethod == NULL) {
printf("One of them is null \n");
}
called = TRUE;
}
, , LowLoevelKeyboardProc :
...
WPARAM param = kbhook->vkCode;
JNIEnv *env;
jint rs = (*javaVM)->AttachCurrentThread(javaVM, (void**)&env, NULL);
if (rs != JNI_OK) {
return NULL;
}
...
case VK_ESCAPE:
printf("Escape pressed !\n");
jstring message = (*env)->NewStringUTF(env, "1B");
(*env)->CallVoidMethod(env, callbackObject, callbackMethod, message);
break;
...
unregisterWinHook , GC'd.
...
(*env)->DeleteGlobalRef(env, callbackObject);
.