Memanggil Kaedah Java daripada C dalam Android: Panduan Terperinci
Memanggil kaedah Java daripada C ialah tugas biasa dalam pembangunan Android. Artikel ini bertujuan untuk menyediakan penyelesaian menyeluruh kepada masalah ini dengan menyelidiki kod Java dan C dan menangani ralat biasa yang mungkin timbul semasa proses ini.
Penyediaan Kod Java
Kod Java yang disediakan mentakrifkan kelas bernama MainActivity dengan kaedah getJniString() yang mengembalikan rentetan daripada C . Kaedah messageMe(), yang kami ingin panggil daripada C , hanya mencetak teks yang diterima.
<code class="java">public class MainActivity extends Activity { ... public void messageMe(String text) { System.out.println(text); } ... }</code>
Kod C
Kod C dalam native.cpp cuba mencari kelas MainActivity, dapatkan semula kaedah messageMe() dan gunakannya pada objek rentetan jstr. Walau bagaimanapun, mesej ralat "java.lang.NoSuchMethodError: messageMe" menunjukkan bahawa kaedah messageMe() tidak dijumpai.
<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>
The Fix
Ralat disebabkan oleh dua isu:
<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>
Kaedah C yang dikemas kini
<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>
Kesimpulan
Dengan menangani seruan objek dan isu ketidakpadanan tandatangan JNI, kami boleh berjaya memanggil kaedah messageMe() daripada kod C.
Atas ialah kandungan terperinci Bagaimana untuk Membetulkan \'java.lang.NoSuchMethodError: messageMe\' Apabila Memanggil Kaedah Java daripada C dalam Android?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!