Android で C から Java メソッドを呼び出すときに「java.lang.NoSuchMethodError: messageMe」を修正する方法

Linda Hamilton
リリース: 2024-11-03 12:15:02
オリジナル
890 人が閲覧しました

How to Fix

Android での C からの Java メソッドの呼び出し: 詳細なチュートリアル

C からの Java メソッドの呼び出しは、Android 開発における一般的なタスクです。この記事は、Java および C コードを詳しく調べ、このプロセス中に発生する可能性のある一般的なエラーに対処することで、この問題に対する包括的な解決策を提供することを目的としています。

Java コードのセットアップ

提供された Java コードは、 C から文字列を返す getJniString() メソッドを使用して MainActivity という名前のクラスを定義します。 C から呼び出す予定の messageMe() メソッドは、単に受信したテキストを出力します。

<code class="java">public class MainActivity extends Activity {
    ...
    public void messageMe(String text) {
        System.out.println(text);
    }
    ...
}</code>
ログイン後にコピー

C コード

native.cpp の C コードMainActivity クラスを検索し、messageMe() メソッドを取得し、それを jstr 文字列オブジェクトで呼び出そうとします。ただし、エラー メッセージ「java.lang.NoSuchMethodError: messageMe」は、messageMe() メソッドが見つからないことを示しています。

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    jclass clazz = env->FindClass("the/package/MainActivity");
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
    env->CallObjectMethod(jstr, messageMe);
    ...
}</code>
ログイン後にコピー

修正

エラーこれは 2 つの問題によって引き起こされます:

  • 不正なオブジェクト呼び出し: messageMe() メソッドにはオブジェクト参照が必要で、これは CallObjectMethod() の最初の引数として渡される必要があります。間違ったコードは、jstr のメソッドを直接呼び出しますが、これは無効です。
  • 無効な JNI 署名: C コードは、messageMe( の署名として (Ljava/lang/String;)V を使用しています。 ) メソッドで、void を返すことを示します。ただし、実際の Java メソッドは String 値を返します。これを修正するには、C コードを次のように変更します。
<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    ...
    jstring result = env->CallObjectMethod(obj, messageMe, jstr);
    ...
}</code>
ログイン後にコピー

更新された C メソッド

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    ...
    jstring result = env->CallObjectMethod(obj, messageMe, jstr);
    const char* str = env->GetStringUTFChars(result, NULL);
    printf("%s\n", str);
    ...
}</code>
ログイン後にコピー

結論

オブジェクト呼び出しと JNI 署名の不一致の問題に対処することで、C コードから messageMe() メソッドを正常に呼び出すことができます。

以上がAndroid で C から Java メソッドを呼び出すときに「java.lang.NoSuchMethodError: messageMe」を修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート