2

Javaコードでメソッドを取得しようとしましjMethodIDたが、この特定の関数を呼び出すと、例外がスローされます:

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: displayKeyStrokes
at org.suhail.keylogger.HelperClasses.NativeMethods.initializeJNIVars(Native Method)
at org.suhail.keylogger.GUI.MainGUI.jMenuItem1ActionPerformed(MainGUI.java:356)
.
.
.

この理由がわかりません。以下は、Java メソッドから呼び出されるCコード スニペットです。

void Java_org_suhail_keylogger_HelperClasses_NativeMethods_initializeJNIVars
(JNIEnv *env, jobject obj) {
 jclass cls = (*env)->GetObjectClass(env,obj);
 callBackToDeliverKeyStroke = (*env)->GetMethodID(env,cls,"displayKeyStrokes","()V");
 object = (*env)->NewGlobalRef(env,obj);
 if(object == NULL | callBackToDeliverKeyStroke == NULL | cls == NULL) {
    printf("Initialization error...One of the variable is Null\n");
 }
}

そして、これはdisplayKeyStrokesJavaコードで名前が付けられたメソッドです:

 public void displayKeyStrokes() {
    System.out.println("Java Message : A Key has been pressed");
}

例外が発生する理由は何ですか?

編集 :

JNI コードを呼び出す Java コード:

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    jMenuItem1.setEnabled(false);
    jMenuItem2.setEnabled(true);
    try {
       System.loadLibrary("Dll_PKeylogger"); // Load the dll written to listen to the tapping of keys
       nativeMethods.initializeJNIVars(); // CALL
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}

NativeMethods クラス(ネイティブ メソッドを宣言します)

package org.suhail.keylogger.HelperClasses;

public class NativeMethods {

 public native void initializeJNIVars();
 public native void unregisterHook(); 

}

注 :initializeJNIVars名前付きの別のクラスのオブジェクトでメソッドを呼び出しており、次のようにイベントが発生するたびに、匿名の内部クラスからNativeMethodsメソッドjMenuItem1ActionPerformed

        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jMenuItem1ActionPerformed(evt);
        }
    });
4

2 に答える 2

1

あなたは次のように述べています:

jMenuItem1ActionPerformed は、displayKeyStrokes と同じクラス内にある匿名クラスから呼び出されます。はい、jMenuItem1ActionPerformed は、ここに示すように匿名の内部クラスから呼び出されることを除いて、jMenuItem1ActionPerformed と同じクラスにあります。

それはおそらくあなたの問題です。jMenuItem1ActionPerformed が匿名の内部クラスにあることは重要であり、jMenuItem1ActionPerformed とは異なるクラスにあることを意味し、JNI C コードからメソッド ID を取得しようとするときにこれを考慮する必要があります。

initializeJNIVars()外部クラスのインスタンスを受け取るパラメーターをメソッドに与えることを検討してから、そのインスタンスをパラメーターに渡し、 を呼び出すときにそれを使用しますGetMethodID(...)。パラメータを as に渡す必要があることに注意してくださいOuterClassName.this

于 2012-10-03T14:57:51.580 に答える
0

取得する例外の説明は次のとおりです。

アプリケーションがクラス (静的またはインスタンス) の指定されたメソッドを呼び出そうとし、そのクラスにそのメソッドの定義がなくなった場合にスローされます。

通常、このエラーはコンパイラによってキャッチされます。このエラーは、クラスの定義が非互換に変更された場合にのみ、実行時に発生する可能性があります。

コード スレッドは分離されていますか? このメソッドを呼び出そうとしたときに、すでに死んでいるスレッドによって displayKeyStrokes メソッドが読み込まれる可能性はありますか?

于 2012-10-03T14:35:50.893 に答える