Saya mencoba menggunakan NDK dengan C ++ dan sepertinya metode penamaan metode tidak benar. metode asli saya adalah sebagai berikut:
extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
//
}
}
dengan tajuk yang dibungkus dengan "C" {} eksternal juga.
Semuanya dapat dikompilasi dengan baik, membuat file .so dan menyalin ke folder libs di bawah proyek saya, tetapi ketika saya men-debug dan menjalankan di Eclipse saya terus mendapatkan pesan log cat bahwa "tidak ada implementasi yang ditemukan untuk native ...". Apakah ada sesuatu yang saya lewatkan karena semua contoh NDK ada di C?
Terima kasih.
android
android-ndk
Patrick Kafka
sumber
sumber
javah
? Jika tidak, Anda harus. :-PSystem.loadLibrary
Jawaban:
Ada beberapa hal yang dapat menyebabkan "penerapan tidak ditemukan". Salah satunya adalah mendapatkan nama prototipe fungsi yang salah, yang lainnya gagal memuat .so sama sekali. Apakah Anda yakin itu
System.loadLibrary()
dipanggil sebelum metode ini digunakan?Jika Anda tidak memiliki
JNI_OnLoad
fungsi yang ditentukan, Anda mungkin ingin membuatnya dan mengeluarkan pesan log hanya untuk memverifikasi bahwa lib berhasil ditarik masuk.Anda sudah menghindari masalah yang paling umum - lupa menggunakan
extern "C"
- jadi masalah di atas atau sedikit salah eja. Seperti apa deklarasi Java itu?sumber
Penyebab tambahan untuk kesalahan ini: nama metode asli Anda yang tidak didekorasi tidak boleh mengandung garis bawah!
Misalnya, saya ingin mengekspor fungsi C bernama
AudioCapture_Ping()
. Ini deklarasi ekspor saya di C:JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object); //Notice the underscore before Ping
Inilah kelas Java saya yang mengimpor fungsinya:
package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapture_Ping(); // FAILS ...
Saya tidak bisa mendapatkan Android untuk secara dinamis menautkan ke metode asli saya sampai saya menghapus garis bawah:
JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapturePing(); // THIS WORKS! ...
sumber
Saya memiliki masalah yang sama, tetapi bagi saya kesalahan itu ada di file Android.mk. Saya memilikinya:
tetapi harus memiliki ini:
perhatikan detail + = sebagai gantinya : =
Saya harap itu membantu.
sumber
Disebut eksternal "C" seperti yang disediakan dalam contoh Studio yang dibuat secara otomatis, tetapi lupa untuk menggabungkan seluruh file lainnya, termasuk fungsi-fungsi berikut, dalam {} tanda kurung. Hanya fungsi pertama yang berhasil.
sumber
Alasan tambahan: Gunakan LOCAL_WHOLE_STATIC_LIBRARY sebagai ganti LOCAL_STATIC_LIBRARY di android.mk. Hal ini menghentikan library agar tidak mengoptimalkan panggilan API yang tidak digunakan karena NDK tidak dapat mendeteksi penggunaan binding native dari kode java.
sumber
Ada contoh cpp di bawah aplikasi di ndk: https://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp
sumber
Gunakan javah (bagian dari Java SDK). Ini adalah alat yang tepat untuk ini (menghasilkan header .h dari file .class).
sumber
Jika nama paket Anda termasuk _ karakter, Anda harus menulis 1 (satu) setelah karakter _ seperti gambar di bawah ini:
MainActivity.java
package com.example.testcpp_2;
native-lib.cpp
sumber
Saya mencoba semua solusi di atas, tetapi tidak ada yang dapat menyelesaikan kesalahan build saya (jni java.lang.UnsatisfiedLinkError: Tidak ada implementasi yang ditemukan untuk ...), akhirnya saya menemukan bahwa saya lupa menambahkan file sumber verifikasi.cpp saya ke CMakeList.txt segmen add_library (verifikasi.cpp otomatis dibuat dengan Ctrl + Enter short key, mungkin nama file lain), semoga tanggapan saya dapat membantu seseorang.
lingkungan build saya: Gradle + CMake
sumber
Saya menghadapi masalah yang sama, dan dalam kasus saya, alasannya adalah karena saya telah menggarisbawahi dalam nama paket "RFID_Test" Saya mengganti nama Paket dan berhasil. Terima kasih user1222021
sumber
Saya menghadapi masalah yang sama dua kali. Kebetulan ponsel yang saya coba untuk memulai aplikasi dari Android Studio menggunakan level API yang belum saya unduh di Android Studio.
sumber