ก่อนเริ่มต้น
คู่มือนี้จะถือว่าคุณคุ้นเคยกับแนวคิดที่แฝงอยู่ใน การเขียนโปรแกรมแบบเนทีฟและในการพัฒนาแอป Android
ข้อมูลเบื้องต้น
ส่วนนี้จะอธิบายภาพรวมเกี่ยวกับวิธีการทำงานของ NDK Android NDK คือชุดของ เครื่องมือที่ช่วยให้คุณฝัง C หรือ C++ ("โค้ดของระบบ") ลงในแอป Android ได้ ความสามารถในการใช้ โค้ดแบบเนทีฟในแอป Android จะเป็นประโยชน์อย่างยิ่งสำหรับนักพัฒนาซอฟต์แวร์ที่ต้องการทำ ดังต่อไปนี้
- ย้ายแอประหว่างแพลตฟอร์ม
- นำไลบรารีที่มีอยู่มาใช้ซ้ำ หรือจัดหาไลบรารีของตนเองเพื่อนำมาใช้ซ้ำ
- เพิ่มประสิทธิภาพในบางกรณี โดยเฉพาะการประมวลผลแบบหนัก อย่างเช่นเกม
วิธีการทำงาน
ส่วนนี้จะแนะนำองค์ประกอบหลักที่ใช้ในการสร้างโฆษณาเนทีฟ สำหรับ Android และอธิบายขั้นตอนการสร้าง
ส่วนประกอบหลัก
คุณควรเข้าใจองค์ประกอบ ต่อไปนี้ในขณะที่คุณสร้าง แอป:
ไลบรารีที่ใช้ร่วมกันที่มาพร้อมเครื่อง: NDK สร้างไลบรารีเหล่านี้หรือไฟล์
.so
จาก ซอร์สโค้ด C/C++ ของคุณไลบรารีแบบคงที่แบบเนทีฟ: NDK ยังสามารถสร้างไลบรารีแบบคงที่ หรือ
.a
ที่คุณสามารถลิงก์ไปยังไลบรารีอื่นๆ ได้Java Native Interface (JNI): JNI คืออินเทอร์เฟซที่ Java และ คอมโพเนนต์ของ C++ จะทำงานร่วมกัน คู่มือนี้จะถือว่ามีความรู้เกี่ยวกับ JNI โปรดดูข้อมูลเกี่ยวกับอินเทอร์เฟซดังกล่าวที่ข้อกำหนดอินเทอร์เฟซเนทีฟของ Java
อินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (ABI): ABI จะเป็นตัวกำหนดว่าแอปของคุณ โค้ดของเครื่องโต้ตอบกับระบบขณะรันไทม์ NDK สร้าง
.so
ไฟล์ตามคำจำกัดความเหล่านี้ ABI ที่แตกต่างกันสอดคล้องกับ สถาปัตยกรรมต่างๆ: NDK มีการสนับสนุน ABI สำหรับ ARM 32 บิต, AArch64, x86 และ x86-64 สำหรับข้อมูลเพิ่มเติม โปรดดู Android ABIไฟล์ Manifest: หากคุณเขียนแอปโดยไม่มีคอมโพเนนต์ของ Java คุณต้อง ให้ประกาศคลาส NativeActivity ใน ประจักษ์แจ้ง โปรดดูใช้ Native_activity.h สามารถทำได้ เพื่ออ่านรายละเอียดเพิ่มเติมในการดำเนินการดังกล่าว
น้ำไหล
ขั้นตอนทั่วไปในการพัฒนาแอปที่มาพร้อมเครื่องสำหรับ Android มีดังนี้
ออกแบบแอป โดยเลือกว่าจะใช้ส่วนใดใน Java และส่วนใด เพื่อนำไปใช้เป็นโค้ดแบบเนทีฟ
สร้างโปรเจ็กต์แอป Android ในลักษณะเดียวกับที่คุณสร้างสำหรับโปรเจ็กต์ Android อื่นๆ
หากคุณเขียนแอปที่มาพร้อมเครื่องเท่านั้น ให้ประกาศคลาส NativeActivity ใน
AndroidManifest.xml
สำหรับข้อมูลเพิ่มเติม โปรดดูที่กิจกรรมของระบบและ แอปพลิเคชันสร้างไฟล์
Android.mk
ที่อธิบายไลบรารีเนทีฟ รวมถึงชื่อ แฟล็ก ไลบรารีที่ลิงก์ และไฟล์ต้นฉบับที่จะรวบรวมใน "JNI" ไดเรกทอรีหรือคุณจะสร้างไฟล์
Application.mk
ที่กำหนดค่าเป้าหมายก็ได้ ABI, Toolchain, โหมดเผยแพร่/แก้ไขข้อบกพร่อง และ STL สำหรับทุกการดำเนินการ ไม่ได้ระบุ ระบบจะใช้ค่าเริ่มต้นต่อไปนี้ตามลำดับ- ABI: ABI ทั้งหมดที่ยังไม่เลิกใช้งาน
- โหมด: ปล่อย
- STL: ระบบ
วางต้นฉบับดั้งเดิมไว้ในไดเรกทอรี
jni
ของโปรเจ็กต์ใช้ ndk-build เพื่อรวบรวมไลบรารีเนทีฟ (
.so
,.a
)สร้างคอมโพเนนต์ Java เพื่อสร้างไฟล์ปฏิบัติการ
.dex
สร้างแพ็กเกจทุกอย่างลงในไฟล์ APK ที่มี
.so
,.dex
และอื่นๆ ไฟล์ที่จำเป็นสำหรับการเรียกใช้แอป
กิจกรรมและแอปพลิเคชันในเครื่อง
Android SDK มีคลาสตัวช่วยชื่อ NativeActivity ที่ช่วยให้คุณ
เขียนกิจกรรมแบบเนทีฟทั้งหมด NativeActivity จะจัดการการสื่อสาร
ระหว่างเฟรมเวิร์ก Android และโค้ดแบบเนทีฟ คุณจึงไม่ต้อง
คลาสย่อยหรือการเรียกเมธอด ที่คุณต้องทำก็แค่ประกาศแอปพลิเคชัน
เป็นเนทีฟในไฟล์ AndroidManifest.xml
และเริ่มสร้างโฆษณาเนทีฟเลย
แอปพลิเคชัน
แอปพลิเคชัน Android ที่ใช้ NativeActivity จะยังคงทำงานในระบบเสมือนจริงของตนเอง โดยใช้แซนด์บ็อกซ์จากแอปพลิเคชันอื่น คุณจึงสามารถเข้าถึง API เฟรมเวิร์ก Android ผ่าน JNI ในบางกรณี เช่น สำหรับเซ็นเซอร์ กิจกรรมอินพุตและเนื้อหาต่างๆ NDK มีอินเทอร์เฟซในตัวที่คุณสามารถใช้ แทนที่จะต้องโทรไปใน JNI ดูข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ โปรดดู Native API
ไม่ว่าคุณจะสร้างกิจกรรมแบบเนทีฟหรือไม่ เราขอแนะนำ คุณจะสร้างโปรเจ็กต์ด้วยเครื่องมือสร้างดั้งเดิมของ Android ดังนั้น ช่วยในการสร้างและรวมแอปพลิเคชัน Android ที่ ใหม่
Android NDK มีตัวเลือก 2 แบบในการใช้กิจกรรมเนทีฟ ดังนี้
- ส่วนหัว native_activity.h กำหนดเวอร์ชันเนทีฟของคลาส NativeActivity ซึ่งประกอบด้วย Callback และโครงสร้างข้อมูลที่คุณต้องการ เพื่อสร้างโฆษณาเนทีฟ กิจกรรม เนื่องจากเทรดหลักของแอปพลิเคชันจะจัดการ Callback การใช้งาน Callback ของคุณต้องไม่ถูกบล็อก หากมีการบล็อก ได้รับข้อผิดพลาด ANR (แอปพลิเคชันไม่ตอบสนอง) เนื่องจากเทรดหลักของคุณคือ ไม่ตอบสนองจนกว่า Callback จะกลับมา
- ไฟล์
android_native_app_glue.h
ระบุไลบรารีตัวช่วยแบบคงที่ที่สร้างบน ด้านบนของอินเทอร์เฟซ native_activity.h และเกิดชุดข้อความอีกรายการ จัดการสิ่งต่างๆ เช่น Callback หรือเหตุการณ์อินพุตใน Event Loop สำหรับเคลื่อนย้ายของใหญ่ เหตุการณ์เหล่านี้ไปยังชุดข้อความแยกต่างหากจะป้องกันไม่ให้ Callback บล็อก เทรดหลัก
<ndk_root>/sources/android/native_app_glue/android_native_app_glue.c
แหล่งที่มานี้ยังพร้อมให้บริการ ซึ่งทำให้คุณแก้ไขการติดตั้งใช้งานได้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ไลบรารีแบบคงที่นี้ ให้ดูที่
แอปพลิเคชันตัวอย่างกิจกรรมเนทีฟและเอกสารประกอบ อ่านเพิ่มเติมคือ
ในความคิดเห็น
<ndk_root>/sources/android/native_app_glue/android_native_app_glue.h
ใช้อินเทอร์เฟซ Native_activity.h
วิธีใช้กิจกรรมเนทีฟที่มีอินเทอร์เฟซ native_activity.h
สร้างไดเรกทอรี
jni/
ในไดเรกทอรีรากของโปรเจ็กต์ ไดเรกทอรีนี้ จัดเก็บโค้ดเนทีฟทั้งหมดของคุณประกาศกิจกรรมแบบเนทีฟในไฟล์
AndroidManifest.xml
เนื่องจากแอปพลิเคชันของคุณไม่มีโค้ด Java ให้ตั้งค่า
android:hasCode
เป็นfalse
<application android:label="@string/app_name" android:hasCode="false">
คุณต้องตั้งค่าแอตทริบิวต์
android:name
ของแท็กกิจกรรมเป็น โฆษณาเนทีฟ<activity android:name="android.app.NativeActivity" android:label="@string/app_name">
แอตทริบิวต์
android:value
ของแท็กmeta-data
ระบุชื่อของ ไลบรารีที่ใช้ร่วมกันที่มีจุดแรกเข้าไปยังแอปพลิเคชัน (เช่น C/C++main
) โดยไม่ใส่คำนำหน้าlib
และคำต่อท้าย.so
จากไลบรารี ชื่อ<manifest> <application> <activity> <meta-data android:name="android.app.lib_name" android:value="native-activity" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
สร้างไฟล์สำหรับกิจกรรมในเครื่องของคุณ และใช้ฟังก์ชันที่มีชื่ออยู่ใน ตัวแปร ANativeActivity_onCreate แอปเรียกใช้ฟังก์ชันนี้เมื่อ กิจกรรมแบบเนทีฟจะเริ่มขึ้น ฟังก์ชันนี้คล้ายกับ
main
ใน C/C++ โดยรับ ตัวชี้ไปยังโครงสร้าง ANativeActivity ซึ่งมีเคอร์เซอร์ฟังก์ชัน เกี่ยวกับการใช้งาน Callback ต่างๆ ที่คุณต้องเขียน ตั้งค่า เคอร์เซอร์ฟังก์ชัน Callback ที่เกี่ยวข้องในANativeActivity->callbacks
ไปยัง การใช้งาน Callbackตั้งค่าช่อง
ANativeActivity->instance
เป็นที่อยู่ของอินสแตนซ์ใดก็ได้ของ ข้อมูลที่ต้องการใช้ใช้สิ่งอื่นที่คุณต้องการให้กิจกรรมทำเมื่อเริ่มต้น
ใช้ Callback ที่เหลือที่คุณตั้งค่าไว้
ANativeActivity->callbacks
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเวลาที่ Callback ที่เรียกว่าการจัดการวงจรกิจกรรมพัฒนาแอปพลิเคชันที่เหลือของคุณ
สร้าง
Android.mk file
ในไดเรกทอรีjni/
ของโปรเจ็กต์เพื่อ อธิบายโมดูลเนทีฟของคุณให้กับระบบบิลด์ สำหรับข้อมูลเพิ่มเติม โปรดดู Android.mkเมื่อคุณมีไฟล์ Android.mk แล้ว ให้คอมไพล์โค้ดเนทีฟโดยใช้ คำสั่ง
ndk-build
cd <path>/<to>/<project> $NDK/ndk-build
สร้างและติดตั้งโปรเจ็กต์ Android ตามปกติ หากโค้ดเนทีฟอยู่ใน ไดเรกทอรี
jni/
สคริปต์บิลด์จะทำแพ็กเกจ.so
โดยอัตโนมัติ ไฟล์ที่สร้างขึ้นจาก APK ดังกล่าวลงใน APK
โค้ดตัวอย่างเพิ่มเติม
หากต้องการดาวน์โหลดตัวอย่าง NDK โปรดดูตัวอย่าง NDK