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

Linda Hamilton
Lepaskan: 2024-11-03 12:15:02
asal
903 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan