Pengantar Detail untuk Proses Pendaftaran Fungsi Java JNI
Ketika kami memanggil kode asli di Java, umumnya diimplementasikan melalui JNI. Kami hanya perlu memuat file perpustakaan .so lokal di kelas Java, menyatakan metode asli, dan kemudian menyebutnya di tempat yang harus dipanggil. Adapun implementasi spesifik dari metode asli di Java, semuanya diserahkan ke lapisan asli. Apa prasyarat bagi kita untuk disebut dengan benar fungsi yang sesuai dalam kode lokal di Java? Jawabannya adalah untuk membangun korespondensi satu-ke-satu antara metode asli di Java dan fungsi dalam kode lokal melalui mekanisme tertentu. Jadi apa mekanisme ini? Ini adalah mekanisme pendaftaran fungsi JNI.
Ada dua cara untuk mendaftarkan fungsi JNI, satu adalah metode pendaftaran statis, dan yang lainnya adalah metode pendaftaran dinamis. Mari kita perkenalkan dua metode implementasi di bawah ini.
1. Pendaftaran statis.
1. Prinsip Implementasi: Tetapkan korespondensi satu-ke-satu antara metode Java dan fungsi JNI berdasarkan nama fungsi.
2. Proses Implementasi:
① menulis kode java;
② Kompilasi kode Java dan buat file .class;
③ Gunakan arahan javah untuk menghasilkan file jni .h menggunakan file .class yang dihasilkan;
④ File header JNI yang dihasilkan berisi deklarasi fungsi Java di lapisan JNI;
3. Kerugian:
① Penulisan sangat tidak nyaman karena nama -nama fungsi lapisan JNI harus mengikuti format tertentu dan namanya sangat panjang;
② Ini akan menyebabkan banyak pekerjaan untuk programmer, karena file header JNI harus ditulis untuk semua kelas Java yang menyatakan fungsi asli;
Program Program ini berjalan tidak efisien, karena ketika memanggil fungsi asli untuk pertama kalinya, Anda perlu mencari fungsi lokal yang sesuai di lapisan JNI sesuai dengan nama fungsi, dan kemudian membangun hubungan yang sesuai. Proses ini memakan waktu.
2. Pendaftaran Dinamis.
1. Prinsip Implementasi: Langsung beri tahu fungsi asli pointernya ke fungsi yang sesuai di JNI;
2. Proses Implementasi:
① Gunakan struktur jninativeMethod untuk menyimpan korespondensi antara fungsi asli Java dan fungsi JNI;
② Simpan korespondensi antara semua fungsi asli dan fungsi JNI dalam array JninativeMethod;
③Setelah Memuat Perpustakaan Dinamis JNI Melalui System.LoadLibrary di Java, hubungi fungsi JNI_ONLOAD dan mulai pendaftaran dinamis;
Fungsi Androidruntime :: RegisternativeMethods akan dipanggil dalam JNI_ONLOAD untuk pendaftaran fungsi;
⑤ Panggilan terakhir ke JniregisternativeMethods di AndroidRuntime :: registernativeMethods Pendaftaran lengkap.
3. Keuntungan: Mengatasi kelemahan pendaftaran statis.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!