2012-06-06 3 views
-1

가능한 중복을 피할 누를 충돌 :
what is wrong with this call to the java method?JVM은 최대한 빨리

다음 C 조각은 Esc 키를 누를 때마다 자바 함수를 호출합니다. C 스 니펫의 첫 번째 블록은 다른 스레드에서 실행되고 두 번째 블록은 다른 스레드에서 실행됩니다. 도우미 키를 누르면 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; 
    } 

자바 코드 조각 : 당신은 당신의 jvm 변수를 초기화 할 필요가

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.

+0

이유는 downhote하시기 바랍니다 –

+2

가장 눈에 띄는 것은 jvm 및 아무데도 가리키는 스위치에 env 있습니다. – josefx

+0

나는이 질문에 대답 해왔다. http://stackoverflow.com/questions/10895826/what-is-wrong-with-this-call-to-the-java-method/10896756#10896756 같은 글을 게시하는 이유 다시 질문 ?? – maba

답변

1

. JNI_CreateJavaVM() 방법을 사용하여이 작업을 수행 할 수 있습니다. 자세한 내용은 여기를 참조하십시오 : http://docs.oracle.com/javase/1.4.2/docs/guide/jni/spec/invocation.html

+1

어떻게이 메서드에서 _ (vm_args) _ 세 번째 인수를 초기화 할 수 있습니까? 답변에서 제공 한 링크가 너무 오래되었습니다. 링크에 언급 된 구조체'JDK1_1InitArgs'가 헤더 파일에서 제거되었습니다. –

+0

JDK1.7에서 jni.h를 검사했고 구조체는'JavaVMInitArgs'입니다. 나는이 하나가 오래된 것을 대체한다고 생각한다. 자세한 내용은 컴퓨터의 \ include \ jni.h를 참조하십시오. –

관련 문제