Memanggil Kaedah Java daripada Native C dalam Android
Apabila menyepadukan kod Java dan C dalam Android, mungkin perlu memanggil kaedah Java daripada kod C asli. Artikel ini menangani isu khusus yang dihadapi apabila cuba menggunakan kaedah Java bernama "messageMe" daripada kod asli dalam kaedah "getJniString".
Dalam coretan kod yang disediakan, pembangun cuba memanggil "messageMe" daripada native C dalam kaedah "getJniString". Walau bagaimanapun, kompilasi gagal dengan pengecualian "NoSuchMethodError", menunjukkan bahawa nama kaedah tidak betul.
Isunya terletak pada cara kaedah "messageMe" digunakan dalam kod asli:
<code class="cpp">jobject result = env->CallObjectMethod(jstr, messageMe);</code>
Di sini, pembolehubah "jstr" mewakili objek Java yang mana kaedah harus dipanggil dan "messageMe" merujuk kepada ID kaedah. Walau bagaimanapun, oleh kerana "messageMe" ialah kaedah kelas "MainActivity" (seperti yang ditakrifkan dalam kod Java), ia tidak boleh dihantar terus kepada "CallObjectMethod" kerana ia akan bersamaan dengan memanggil "jstr.myMethod()", iaitu tidak betul.
Untuk menyelesaikan isu ini, kod asli hendaklah menghantar pembolehubah "obj", yang mewakili tika kelas "MainActivity", kepada "CallObjectMethod" seperti berikut:
<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe);</code>
Selain itu, jika kaedah "messageMe" ditakrifkan sebagai tidak sah (seperti yang terdapat dalam kod yang diberikan), "CallVoidMethod" harus digunakan dan bukannya "CallObjectMethod":
<code class="cpp">env->CallVoidMethod(obj, messageMe, jstr);</code>
Jika keputusan dijangka daripada kaedah "messageMe", kod Java dan tandatangan JNI perlu diubah suai untuk mengembalikan nilai.
Atas ialah kandungan terperinci Mengapakah saya mendapat \'NoSuchMethodError\' apabila memanggil kaedah Java daripada C asli dalam Android?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!