ตัวอย่าง: Hello-jni

ตัวอย่างนี้จะแนะนำ 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 ".");