ตัวอย่างนี้จะแนะนำ hello-jni ซึ่งเป็นแอปพลิเคชัน C/C++ ขั้นต่ำที่สร้างด้วย NDK ตัวอย่างนี้อยู่ในไดเรกทอรี hello-jni ของรีโป ndk-samples ภายในสาขา 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/
โดยจะเรียกใช้ฟังก์ชันเพื่อดึงสตริงจากด้านดั้งเดิม แล้วแสดงบนหน้าจอ
โค้ดต้นฉบับมี 3 บรรทัดที่น่าสนใจสำหรับผู้ใช้ 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 ".");