ホームページ  >  記事  >  バックエンド開発  >  Android で C から Java メソッドを呼び出すと「NoSuchMethodError」が発生するのはなぜですか?

Android で C から Java メソッドを呼び出すと「NoSuchMethodError」が発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 21:23:29975ブラウズ

Why am I getting a

Android で C から Java メソッドを呼び出す: Java 例外を克服する

Android 開発では、C から Java メソッドを呼び出すのは簡単です。ただし、注意しないと「NoSuchMethodError」例外が発生する可能性があります。

Java コード

まず Java コードを調べてみましょう。

<code class="java">public class MainActivity extends Activity {
    //...

    public void messageMe(String text) {
        System.out.println(text);
    }

    //...
}</code>

このコードは、文字列を引数として受け取る「messageMe」というメソッドを定義します。

C コード

次に、C を見てみましょう。 「messageMe」を呼び出そうとするコード:

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    //...

    // Get the method that you want to call
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");

    //...

    jobject result = env->CallObjectMethod(jstr, messageMe);
    //...
}</code>

このコードでは、問題は「CallObjectMethod」関数にあります。このメソッドでは、「obj」パラメータがメソッドが呼び出されるオブジェクトである必要があります。ただし、指定されたコードでは、代わりにメソッドに渡される文字列である「jstr」が使用されています。

解決策

これを修正するには、以下が必要です。最初の引数として正しいオブジェクトを "CallObjectMethod" に渡します:

<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe, jstr);</code>

さらに、"messageMe" は void メソッドであるため、"CallObjectMethod" の代わりに "CallVoidMethod" を呼び出す必要があります。また、新しい戻り値の型に一致するように JNI 署名と Java コードを変更することを忘れないでください。

以上がAndroid で C から Java メソッドを呼び出すと「NoSuchMethodError」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。