가능한 중복을 피할 누를 충돌 :
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.
이유는 downhote하시기 바랍니다 –
가장 눈에 띄는 것은 jvm 및 아무데도 가리키는 스위치에 env 있습니다. – josefx
나는이 질문에 대답 해왔다. http://stackoverflow.com/questions/10895826/what-is-wrong-with-this-call-to-the-java-method/10896756#10896756 같은 글을 게시하는 이유 다시 질문 ?? – maba