java - 一旦我按下Escape键,jvm就会崩溃

标签 java c multithreading java-native-interface

Possible Duplicate:
what is wrong with this call to the java method?

只要按下转义键,以下 C 代码片段就会调用 java 函数。 C 代码片段的第一个 block 在不同的线程上执行,第二个 block 在不同的线程上执行。当我按转义键时,消息 escape key pressed显示,然后jvm崩溃。为什么java函数没有被调用?

C 代码:

    if(called) {// starts on a different thread
    switch(param) {
        case VK_CONTROL:
            printf("Control pressed !\n");
            //(*Env)->CallVoidMethodA(Env,Obj,mid,"11");
            break;
        case VK_SHIFT:
            printf("Shift pressed !\n");
            //(*Env)->CallVoidMethodA(Env,Obj,mid,"10");
            break;
        case VK_ESCAPE:
            printf("Escape pressed !\n");
            JavaVM *jvm;
            JNIEnv *env;
            jmethodID mid;
            env = (*jvm)->AttachCurrentThread(jvm,&env,NULL);
            jclass cls = (*env)->GetObjectClass(env,Obj);
            mid = (*env)->GetMethodID(env,cls,"callBack","(Ljava/lang/String;)V");
            (*env)->CallVoidMethodA(env,Obj,mid,(*env)->NewStringUTF(env,"1B")); // Calling the java function
            break;
        default:
            printf("The default case\n");
            break;
    }}

    void Java_keylogger_TestKeys_initializeJNIVars
     (JNIEnv *env, jobject obj) { // starts on a different thread

      Obj = (*env)->NewGlobalRef(env,obj);
      if(Obj == NULL) {
        printf("Obj is Null\n");
      }
      called = TRUE;
   }

Java 代码片段:

    public void callBack(String key) {
      String x = KeyEvent.getKeyText(Integer.parseInt(key, 16));
      System.out.println(x);
    }

I have uploaded the complete code with the output here.

最佳答案

您需要初始化您的jvm变量。您可以使用 JNI_CreateJavaVM() 方法来执行此操作。请参阅此处了解更多信息:http://docs.oracle.com/javase/1.4.2/docs/guide/jni/spec/invocation.html

关于java - 一旦我按下Escape键,jvm就会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912878/

相关文章:

C 宏扩展不像预期的那样递归

java - log4j 用于具有不同输出文件/配置的线程

Python3线程池: apply function to task generator

java - 开源 Java CMS

java.lang.StringIndexOutOfBoundsException : Exception 异常

c - 正弦的简单近似

java - 非法监控状态异常

JavaFX 在 FXML 文档中打开 WebView

java - 我的服务没有启动

将一个文件的内容复制到另一个文件