ตัวอย่างนี้จะแนะนำคุณเกี่ยวกับ Hello-jni ซึ่งเป็น แอปพลิเคชัน C/C++ ที่สร้างด้วย NDK ตัวอย่างนี้อยู่ในไดเรกทอรี hello-jni ของที่เก็บตัวอย่าง ndk ในสาขา android-mk
Android mk
2 บรรทัดต่อไปนี้จะมีชื่อไฟล์ต้นฉบับ พร้อมกับ
ด้วยชื่อของไลบรารีที่ใช้ร่วมกันเพื่อสร้าง ชื่อและนามสกุลสิ่งที่สร้างขึ้น
ไลบรารีคือ libhello-jni.so
เมื่อระบบบิลด์เพิ่ม
คำนำหน้า lib
และส่วนขยาย .so
LOCAL_SRC_FILES := hello-jni.c LOCAL_MODULE := hello-jni
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ไฟล์ Android.mk
ทำและวิธีใช้ โปรดดู
Android.mk
Application.mk
บรรทัดนี้จะบอกระบบบิลด์ว่า CPU และสถาปัตยกรรมใดที่ต้องสร้าง ด้วยวิธีนี้ ตัวอย่างเช่น ระบบบิลด์จะสร้างสำหรับสถาปัตยกรรมที่สนับสนุนทั้งหมด
APP_ABI := all
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ Application.mk
และวิธีใช้ โปรดดู
Application.mk
การใช้งานด้าน Java
ไฟล์ helloJNI.java
อยู่ใน hellojni/src/com/example/hellojni/
เรียกใช้
ฟังก์ชันเพื่อเรียกสตริงจากด้านดั้งเดิม จากนั้นแสดงฟังก์ชันดังกล่าวบนหน้าจอ
ซอร์สโค้ดประกอบด้วยสามบรรทัดที่ผู้ใช้ NDK สนใจเป็นพิเศษ ซึ่งจะแสดงตามลำดับที่นำไปใช้แทน ตามลำดับบรรทัด
การเรียกใช้ฟังก์ชันนี้จะโหลดไฟล์ .so
เมื่อเริ่มต้นแอปพลิเคชัน
Kotlin
System.loadLibrary("hello-jni")
Java
System.loadLibrary("hello-jni");
คีย์เวิร์ด native
ในการประกาศเมธอดนี้จะบอก
เครื่องเสมือนที่มีฟังก์ชันนั้นอยู่ในไลบรารีที่ใช้ร่วมกัน (กล่าวคือ ใช้งานบน
)
Kotlin
external fun stringFromJNI(): String
Java
public native String stringFromJNI();
เฟรมเวิร์ก Android เรียกใช้ฟังก์ชันที่โหลดและประกาศใน ขั้นตอนก่อนหน้านี้ ซึ่งแสดงสตริงบนหน้าจอ
Kotlin
tv.text = stringFromJNI()
Java
tv.setText( stringFromJNI() );
การใช้งานด้าน C
ไฟล์ hello-jni.c
อยู่ใน hello-jni/jni/
โดยมีฟังก์ชันที่
แสดงผลสตริงที่ฝั่ง Java ร้องขอ) การประกาศฟังก์ชันมีลักษณะดังต่อไปนี้
ดังต่อไปนี้:
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
การประกาศนี้สอดคล้องกับฟังก์ชันเนทีฟที่ประกาศใน
ซอร์สโค้ด Java ประเภทการแสดงผล jstring
เป็นประเภทข้อมูลที่กำหนด
ในช่วง
เนทีฟ Java
ข้อกำหนดอินเทอร์เฟซ ที่จริงแล้วไม่ใช่สตริง แต่เป็น
ชี้ไปที่สตริง Java
หลัง jstring
จะมาจากชื่อฟังก์ชัน ซึ่งอิงตามพารามิเตอร์
ชื่อฟังก์ชัน Java และเส้นทางไปยังไฟล์ที่อยู่ภายใน ก่อสร้าง
ตามกฎต่อไปนี้
- แทรก
Java_
ไว้ข้างหน้า - อธิบายเส้นทางไฟล์ซึ่งเกี่ยวข้องกับไดเรกทอรีแหล่งที่มาระดับบนสุด
- ใช้ขีดล่างแทนเครื่องหมายทับ
- อย่าใส่นามสกุลไฟล์
.java
- หลังขีดล่างสุดท้าย ให้ใส่ชื่อฟังก์ชันต่อท้าย
ตัวอย่างนี้ใช้ชื่อฟังก์ชันซึ่งเป็นไปตามกฎเหล่านี้
Java_com_example_hellojni_HelloJni_stringFromJNI
ชื่อนี้หมายถึง Java
ฟังก์ชันชื่อ stringFromJNI()
ซึ่งอยู่ใน
hellojni/src/com/example/hellojni/HelloJni.java
JNIEnv*
คือตัวชี้ไปยัง VM และ
jobject
คือตัวชี้ไปยังออบเจ็กต์ this
โดยนัยที่ส่งผ่านจาก
ฝั่ง Java
บรรทัดต่อไปนี้เรียกใช้ VM API (*env)
และส่งค่าส่งกลับ
ซึ่งก็คือสตริงที่ฟังก์ชันในฝั่ง Java ได้ขอไป
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");