为什么jvm崩溃,因为我回调了java函数?

Suh*_*pta 0 c java java-native-interface

以下java片段调用jni函数Java_org_suhail_keylogger_HelperClasses_NativeMethods_unregisterHook:

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    jMenuItem1.setEnabled(false);
    jMenuItem2.setEnabled(true);
    try {
       System.loadLibrary("Dll_PKeylogger"); // Load the dll written to listen to the tapping of keys
       nativeMethods.initializeJNIVars(); // called upon the object of a class named NativeMethods
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

NativeMethods(类,其对象用于调用上面的JNI C方法):

public class NativeMethods {

  public native void initializeJNIVars();
  public native void unregisterHook();

  public void displayKeyStrokes() { // FUNCTION THAT IS CALLED BACK FROM JNI C CODE
    System.out.println("Java Message : A Key has been pressed");
  }
}
Run Code Online (Sandbox Code Playgroud)

JNI C方法,由java代码调用:

void Java_org_suhail_keylogger_HelperClasses_NativeMethods_initializeJNIVars
(JNIEnv *env, jobject obj) {
  jclass cls = (*env)->GetObjectClass(env,obj);
  callBackToDeliverKeyStroke = (*env)->GetMethodID(env,cls,"displayKeyStrokes","()V");
  object = (*env)->NewGlobalRef(env,obj);
  if(object == NULL | callBackToDeliverKeyStroke == NULL | cls == NULL) {
     printf("Initialization error...One of the variable is Null\n");
  }
 }
Run Code Online (Sandbox Code Playgroud)

调用java函数的上述方法在同一模块中的方法:

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
  JNIEnv *Env;
  (*Env)->CallVoidMethod(Env,object,callBackToDeliverKeyStroke); 
  // I have initialized object and callBackToDeliverKeyStroke in the above method
}
Run Code Online (Sandbox Code Playgroud)

当执行到达最后执行点时,即上面提到的函数JVM崩溃.这是为什么 ?我哪里弄错了?

mab*_*aba 5

JNIEnv *Env;
(*Env)->CallVoidMethod(Env,object,callBackToDeliverKeyStroke);
Run Code Online (Sandbox Code Playgroud)

Env 未初始化.