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

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