แนวคิด

ก่อนเริ่มต้น

คู่มือนี้จะถือว่าคุณคุ้นเคยกับแนวคิดที่แฝงอยู่ใน การเขียนโปรแกรมแบบเนทีฟและในการพัฒนาแอป 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 มีดังนี้

  1. ออกแบบแอป โดยเลือกว่าจะใช้ส่วนใดใน Java และส่วนใด เพื่อนำไปใช้เป็นโค้ดแบบเนทีฟ

  2. สร้างโปรเจ็กต์แอป Android ในลักษณะเดียวกับที่คุณสร้างสำหรับโปรเจ็กต์ Android อื่นๆ

  3. หากคุณเขียนแอปที่มาพร้อมเครื่องเท่านั้น ให้ประกาศคลาส NativeActivity ใน AndroidManifest.xml สำหรับข้อมูลเพิ่มเติม โปรดดูที่กิจกรรมของระบบและ แอปพลิเคชัน

  4. สร้างไฟล์ Android.mk ที่อธิบายไลบรารีเนทีฟ รวมถึงชื่อ แฟล็ก ไลบรารีที่ลิงก์ และไฟล์ต้นฉบับที่จะรวบรวมใน "JNI" ไดเรกทอรี

  5. หรือคุณจะสร้างไฟล์ Application.mk ที่กำหนดค่าเป้าหมายก็ได้ ABI, Toolchain, โหมดเผยแพร่/แก้ไขข้อบกพร่อง และ STL สำหรับทุกการดำเนินการ ไม่ได้ระบุ ระบบจะใช้ค่าเริ่มต้นต่อไปนี้ตามลำดับ

    • ABI: ABI ทั้งหมดที่ยังไม่เลิกใช้งาน
    • โหมด: ปล่อย
    • STL: ระบบ
  6. วางต้นฉบับดั้งเดิมไว้ในไดเรกทอรี jni ของโปรเจ็กต์

  7. ใช้ ndk-build เพื่อรวบรวมไลบรารีเนทีฟ (.so, .a)

  8. สร้างคอมโพเนนต์ Java เพื่อสร้างไฟล์ปฏิบัติการ .dex

  9. สร้างแพ็กเกจทุกอย่างลงในไฟล์ 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

  1. สร้างไดเรกทอรี jni/ ในไดเรกทอรีรากของโปรเจ็กต์ ไดเรกทอรีนี้ จัดเก็บโค้ดเนทีฟทั้งหมดของคุณ

  2. ประกาศกิจกรรมแบบเนทีฟในไฟล์ 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>
    
  3. สร้างไฟล์สำหรับกิจกรรมในเครื่องของคุณ และใช้ฟังก์ชันที่มีชื่ออยู่ใน ตัวแปร ANativeActivity_onCreate แอปเรียกใช้ฟังก์ชันนี้เมื่อ กิจกรรมแบบเนทีฟจะเริ่มขึ้น ฟังก์ชันนี้คล้ายกับ main ใน C/C++ โดยรับ ตัวชี้ไปยังโครงสร้าง ANativeActivity ซึ่งมีเคอร์เซอร์ฟังก์ชัน เกี่ยวกับการใช้งาน Callback ต่างๆ ที่คุณต้องเขียน ตั้งค่า เคอร์เซอร์ฟังก์ชัน Callback ที่เกี่ยวข้องใน ANativeActivity->callbacks ไปยัง การใช้งาน Callback

  4. ตั้งค่าช่อง ANativeActivity->instance เป็นที่อยู่ของอินสแตนซ์ใดก็ได้ของ ข้อมูลที่ต้องการใช้

  5. ใช้สิ่งอื่นที่คุณต้องการให้กิจกรรมทำเมื่อเริ่มต้น

  6. ใช้ Callback ที่เหลือที่คุณตั้งค่าไว้ ANativeActivity->callbacks สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเวลาที่ Callback ที่เรียกว่าการจัดการวงจรกิจกรรม

  7. พัฒนาแอปพลิเคชันที่เหลือของคุณ

  8. สร้าง Android.mk file ในไดเรกทอรี jni/ ของโปรเจ็กต์เพื่อ อธิบายโมดูลเนทีฟของคุณให้กับระบบบิลด์ สำหรับข้อมูลเพิ่มเติม โปรดดู Android.mk

  9. เมื่อคุณมีไฟล์ Android.mk แล้ว ให้คอมไพล์โค้ดเนทีฟโดยใช้ คำสั่ง ndk-build

    cd <path>/<to>/<project>
    $NDK/ndk-build
    
  10. สร้างและติดตั้งโปรเจ็กต์ Android ตามปกติ หากโค้ดเนทีฟอยู่ใน ไดเรกทอรี jni/ สคริปต์บิลด์จะทำแพ็กเกจ .so โดยอัตโนมัติ ไฟล์ที่สร้างขึ้นจาก APK ดังกล่าวลงใน APK

โค้ดตัวอย่างเพิ่มเติม

หากต้องการดาวน์โหลดตัวอย่าง NDK โปรดดูตัวอย่าง NDK