-1

重複の可能性:
このjavaメソッドの呼び出しの何が問題になっていますか?

次のCスニペットは、エスケープキーが押されるたびにJava関数を呼び出します。Cスニペットの最初のブロックは別のスレッドで実行され、2番目のブロックは別のスレッドで実行されます。エスケープキーを押すと、メッセージ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);
    }

ここに出力を含む完全なコードをアップロードしました。

4

1 に答える 1

1

変数を初期化する必要がありjvmます。JNI_CreateJavaVM()メソッドを使用してこれを行うことができます。詳細については、こちらを参照してください: http: //docs.oracle.com/javase/1.4.2/docs/guide/jni/spec/invocation.html

于 2012-06-06T11:05:06.710 に答える