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 サイトの他の関連記事を参照してください。