Android mendukung bahasa C ++ (NDK) dan Java (SDK). Saat menggunakan bahasa C ++, sangat penting untuk berinteraksi dengan kode C ++ dan Java. Ada contoh sederhana untuk sampel/hello-jni untuk dirujuk dalam paket NDK yang diunduh.
Java Calls C ++
Buat proyek Android baru dan buat kelas berikut:
Paket com.example.testjni; kelas publik TextJni {// Dukungan ke C static {System.LoadLibrary ("JNIInterface"); } public static native int getInt (); string asli statis public getstring ();}Di atas menyatakan dua metode asli, menunjukkan bahwa implementasi metode getint dan getstring akan diberikan dalam C ++ (libjniinterface.so).
Jalankan perintah berikut di direktori kelas untuk menghasilkan file implementasi yang sesuai dengan asli.
javah com.example.testjni.textjni # Catatan bahwa jika Anda ingin memiliki kelas sdk android, Anda perlu menentukan classpath, seperti javah -classpath /users/richard/dev/android/sdk/platforms/android-1android.jar:.bin/sdk/platforms/android-19/android.jar:.bin/sdk/platform
Hasilkan file header dan salin, buat folder JNI, dan buat file implementasi CPP
com_example_testjni_textjni.cpp: #include <stdio.h> #include <stdlib.h> #include "com_example_testjni_textjni.h" int sum () {int x, y; x = 100; y = 1000; x += y; return x;} // Metode untuk mengimplementasikan com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getint (jnienv * env, jclass cls) {return sum ();} jNiexport JString JSport JNICALL CLS) {return sum ();} jNiexport JString JNICALL JNICALL CLS) {return SUM ();} JNiexport JSPORT JNICALL JNICOLL Java_com_example_testjni_textjni_getstring (jnienv * env, jclass cls) {return env-> newstringutf ("hellondk!");}Kompilasi silang digunakan di sini, dan Android.mk diperlukan untuk mengatur kode C ++.
Buat file android.mk baru di bawah JNI/
Android.mk:local_path: = $ (hubungi my-dir) Sertakan $ (clear_vars) local_module: = jniinterfacelocal_src_files: = com_example_testjni_textjni.cpp#local_c_includes: = $ (local_path) termasuk $ ()
Kemudian Anda dapat menggunakan alat ini di NDK: NDK-Build untuk menghasilkan Perpustakaan Tautan Dinamis: libjniinterface.so
File perpustakaan yang dihasilkan dapat dipanggil oleh file Java sebelumnya.
C ++ Call Java
Anda dapat menggunakan JNI untuk memanggil Java dalam metode getstring dalam contoh di atas:
Jniexport jString jnicall java_com_togic_testjni2_textjni_getstring (jnienv * env, jclass cls) {jclass textjni; jobject insttextjni; jMethodid getCurrint; Jnienv* jnienv = env; Textjni = jnienv-> findClass ("com/togic/testjni2/textjni"); jMethodid construction_id = jnienv-> getMethodid (textjni, "init", "() v"); insttextjni = jnienv-> newObject (textjni, construction_id); getCurrint = jnienv-> getstaticmethodid (TextJni, "getCurrint", "() i"); // hubungi metode statis java jint jiref = jnienv-> callstaticintmethod (textjni, getCurrint); // bersihkan jnienv-> deletelocalref (textjni); jnienv-> deletelocalref (insttextjni); std :: string strref = "hellondk!" + view-> getStaticString (); return env-> newstringutf (strref.c_str ());}Pertama -tama, perlu dicatat bahwa fungsi dalam JNI.h membedakan antara bahasa C dan C ++. Untuk C ++, berikut ini umumnya sebagai berikut:
jclass clazz = env-> findClass (classname);
Dan untuk C:
jclass clazz = (*env)-> findClass (env, className);
Parameter ketiga dalam getMethodid mewakili tanda tangan metode, yang dapat diperoleh sebagai berikut:
JAVAP -S Nama Paket. Nama kelas mendapatkan tanda tangan dari metode ini
Konversi tipe data JNI terlampir
jString to char *
const char nativestring = (env)-> getstringutfchars (env, javastring, 0);
Mengembalikan pointer ke array karakter UTF-8 dari string yang akan tetap valid sampai dirilis oleh ReleasestringutFchars ().
(*env)-> recereasestringutfchars (env, javastring, nativestring);
char * ke jString
jString jstr = (env)-> newstringutf (env, char utf)
Gunakan array karakter UTF-8 untuk membangun objek java.lang.string baru.
Jenis Lain Pilih Semua Salinan ke dalam Catatan Java Jenis Deskripsi Jenis C Lokal
boolean jboolean tidak ditandatangani, 8 bit
byte jbyte tidak ditandatangani, 8 bit
char jchar tidak ditandatangani, 16 bit
JShort pendek ditandatangani, 16 bit
Int Jint ditandatangani, 32 bit
Long Jlong ditandatangani, 64 bit
float jfloat 32 bit
Double Jdouble 64 bit
membatalkan void n/a