Android รองรับภาษา C ++ (NDK) และ Java (SDK) เมื่อใช้ภาษา C ++ เป็นสิ่งสำคัญอย่างยิ่งที่จะต้องโต้ตอบกับรหัส C ++ และ Java มีตัวอย่างง่ายๆสำหรับตัวอย่าง/hello-jni ที่จะอ้างถึงในแพ็คเกจ NDK ที่ดาวน์โหลด
Java เรียก C ++
สร้างโครงการ Android ใหม่และสร้างคลาสต่อไปนี้:
แพ็คเกจ com.example.testjni; Public Class Textjni {// รองรับ c static {system.loadLibrary ("JniInterface"); } สาธารณะพื้นเมืองคงที่ int getint (); String Native Public Native GetString ();}ข้างต้นประกาศสองวิธีดั้งเดิมแสดงให้เห็นว่าการใช้วิธีการของ getint และ getString จะได้รับใน C ++ (libjniinterface.SO)
เรียกใช้คำสั่งต่อไปนี้ในไดเรกทอรีคลาสเพื่อสร้างไฟล์การใช้งานที่สอดคล้องกับเนทีฟ
javah com.example.testjni.textjni # โปรดทราบว่าหากคุณต้องการมีคลาส Android SDK คุณจะต้องระบุ classpath เช่น javah -classpath /users/richard/dev/android/sdk/platforms/android-19/android.jarm.
สร้างไฟล์ส่วนหัวและคัดลอกสร้างโฟลเดอร์ JNI และสร้างไฟล์การใช้งาน 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 = 1,000; x += y; return x;} // วิธีการใช้ com_example_textjni_textjni.h jniexport Jint Jnicall java_com_example_testjni_textjni_getint (jnienv * env, jclass cls) java_com_example_testjni_textjni_getstring (jnienv * env, jclass cls) {return env-> newstringutf ("Hellondk!");}การรวบรวมข้ามถูกใช้ที่นี่และ Android.mk จำเป็นต้องจัดระเบียบรหัส C ++
สร้างไฟล์ Android.mk ใหม่ภายใต้ JNI/
Android.mk:local_path: = $ (โทรหาฉัน-Dir) รวม $ (clear_vars) local_module: = jniinterfacelocal_src_files: = com_example_testjni_textjni.cpp#local_c_includes: = $ (ท้องถิ่น
จากนั้นคุณสามารถใช้เครื่องมือใน NDK: NDK-Build เพื่อสร้างไลบรารีลิงก์แบบไดนามิก: libjniinterface.so
ไฟล์ไลบรารีที่สร้างขึ้นสามารถเรียกได้โดยไฟล์ Java ก่อนหน้า
C ++ โทรหา Java
คุณสามารถใช้ JNI เพื่อโทรหา Java ในวิธี GetString ในตัวอย่างข้างต้น:
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"); // โทรหา java method jint jiref = jnienv-> callstaticintmethod (textjni, getCurrint); // ทำความสะอาด jnienv-> deletelocalref (textjni); jnienv-> deletelocalref (instextjni); std :: string strref = "Hellondk!" + view-> getStaticString (); return env-> newstringutf (strref.c_str ());}ก่อนอื่นมันเป็นเรื่องน่าสังเกตว่าฟังก์ชั่นใน Jni.h แยกแยะระหว่างภาษา C และ C ++ สำหรับ C ++ ต่อไปนี้โดยทั่วไปมีดังนี้:
jclass clazz = env-> findclass (classname);
และสำหรับ C:
jclass clazz = (*env)-> findclass (env, classname);
พารามิเตอร์ที่สามใน getMethodid แสดงถึงลายเซ็นวิธีการซึ่งสามารถรับได้ดังนี้:
Javap -s ชื่อแพ็คเกจ ชื่อคลาสได้รับลายเซ็นของวิธีการ
การแปลงประเภทข้อมูล JNI ที่แนบมา
jstring ถึงถ่าน *
const char nativestring = (env)-> getStringUtfchars (env, javastring, 0);
ส่งคืนตัวชี้ไปยังอาร์เรย์อักขระ UTF-8 ของสตริงที่จะยังคงถูกต้องจนกว่าจะถูกปล่อยออกมาโดย releasestringutfchars ()
(*env)-> releasestringutfchars (env, javastring, nativestring);
ถ่าน * ถึง jstring
jString jstr = (env)-> newstringutf (env, char utf)
ใช้อาร์เรย์อักขระ UTF-8 เพื่อสร้างวัตถุ Java.lang.String ใหม่
ประเภทอื่น ๆ เลือกสำเนาทั้งหมดลงในหมายเหตุประเภท Java Local Cesport Description
บูลีน Jboolean ไม่ได้ลงนาม 8 บิต
Byte Jbyte ไม่ได้ลงนาม 8 บิต
Char Jchar unsigned, 16 บิต
jshort สั้นลงนาม 16 บิต
int jint ลงนาม 32 บิต
Jlong Long Signed, 64 บิต
ลอย jfloat 32 บิต
double jdouble 64 บิต
โมฆะเป็นโมฆะ N/A