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 つの問題によって引き起こされます:
<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 サイトの他の関連記事を参照してください。