重複の可能性:
この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);
}