Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membetulkan \"java.lang.NoSuchMethodError: messageMe\" Apabila Memanggil Kaedah Java daripada C dalam Android?

Bagaimana untuk Membetulkan \"java.lang.NoSuchMethodError: messageMe\" Apabila Memanggil Kaedah Java daripada C dalam Android?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 12:15:02894semak imbas

How to Fix

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:

  • Invokasi Objek Salah: Kaedah messageMe() memerlukan rujukan objek, yang harus dihantar sebagai argumen pertama kepada CallObjectMethod(). Kod yang salah memanggil kaedah pada jstr secara langsung, yang tidak sah.
  • Tandatangan JNI Tidak Sah: Kod C menggunakan (Ljava/lang/String;)V sebagai tandatangan untuk messageMe( ) kaedah, menunjukkan bahawa ia mengembalikan batal. Walau bagaimanapun, kaedah Java sebenar mengembalikan nilai String. Untuk membetulkannya, tukar kod C kepada:
<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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn