ด้วยการอัปเดตของ Android Studio เป็น 1.0 เครื่องมือสนับสนุน NDK พัฒนาขึ้นอย่างมาก ( หมายเหตุ: โปรดอ่านการอัปเดตของฉันที่ด้านล่างของโพสต์นี้เพื่อดูการใช้งานด้วยปลั๊กอิน Gradle รุ่นใหม่และ Android Studio 1.5 )
Android Studio และ NDK นั้นถูกรวมเข้าด้วยกันอย่างเพียงพอดังนั้นคุณเพียงแค่ต้องสร้างบล็อก ndk {} ใน build.gradle ของโมดูลของคุณและตั้งค่าไฟล์ต้นฉบับของคุณลงในไดเรกทอรี (โมดูล) / src / main / jni - และคุณ ทำ!
ไม่มี ndk-build อีกต่อไปจากบรรทัดคำสั่ง
ฉันได้เขียนเกี่ยวกับเรื่องนี้ในบล็อกโพสต์ของฉันที่นี่: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
จุดสำคัญคือ:
มีสองสิ่งที่คุณต้องรู้ที่นี่ โดยค่าเริ่มต้นหากคุณมี libs ภายนอกที่คุณต้องการโหลดลงในแอปพลิเคชัน Android พวกเขาจะค้นหาใน (โมดูล) / src / main / jniLibs โดยค่าเริ่มต้น คุณสามารถเปลี่ยนแปลงสิ่งนี้ได้โดยใช้การตั้งค่า sourceSets.main.jniLibs.srcDirs ใน build.gradle ของโมดูลของคุณ คุณจะต้องมีไดเรกทอรีย่อยพร้อมห้องสมุดสำหรับแต่ละสถาปัตยกรรมที่คุณกำหนดเป้าหมาย (เช่น x86, arm, mips, arm64-v8a, ฯลฯ …)
รหัสที่คุณต้องการรวบรวมโดยค่าเริ่มต้นโดย NDK toolchain จะอยู่ใน (โมดูล) / src / main / jni และในทำนองเดียวกันกับข้างต้นคุณสามารถเปลี่ยนได้โดยการตั้งค่า sourceSets.main.jni.srcDirs ใน build.gradle โมดูลของคุณ
และใส่สิ่งนี้ลงใน build.gradle ของโมดูลของคุณ:
ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
นั่นคือขั้นตอนการรวบรวมรหัส C ++ ของคุณจากตรงนั้นคุณต้องโหลดมันและสร้าง wrappers - แต่จากการตัดสินจากคำถามของคุณคุณก็รู้วิธีการทำทั้งหมดแล้วดังนั้นฉันจะไม่แฮชอีกครั้ง
นอกจากนี้ฉันได้วาง repo Github ของตัวอย่างนี้ที่นี่: http://github.com/sureshjoshi/android-ndk-swig-example
อัปเดต: 14 มิถุนายน 2558
เมื่อ Android Studio 1.3 ออกมาควรมีการสนับสนุน C ++ ผ่านทางปลั๊กอิน JetBrains CLion ขณะนี้ฉันอยู่ภายใต้สมมติฐานว่าจะอนุญาตให้พัฒนา Java และ C ++ จากภายใน Android Studio; อย่างไรก็ตามฉันคิดว่าเราจะต้องใช้ส่วน Gradle NDK ตามที่ฉันได้กล่าวไว้ข้างต้น นอกจากนี้ฉันคิดว่ายังคงมีความจำเป็นต้องเขียนไฟล์ตัวห่อ Java <-> C ++ ยกเว้นว่า CLion จะทำสิ่งเหล่านั้นโดยอัตโนมัติ
อัปเดต: 5 มกราคม 2559
ฉันได้อัปเดตบล็อกของฉันและ Github repo (ในสาขาที่กำลังพัฒนา) เพื่อใช้ Android Studio 1.5 กับปลั๊กอิน Gradle รุ่นทดลองล่าสุด (0.6.0-alpha3)
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
http://github.com/sureshjoshi/android-ndk-swig-example
Gradle build สำหรับส่วน NDK ตอนนี้มีลักษณะดังนี้:
android.ndk {
moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
cppFlags.add("-fexceptions")
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}
นอกจากนี้ Android Studio ยังมีระบบเติมข้อความอัตโนมัติสำหรับ C ++ - Java ที่สร้างโดยใช้คำสำคัญ 'native':
อย่างไรก็ตามมันไม่ได้เป็นสีดอกกุหลาบอย่างสมบูรณ์ ... หากคุณใช้ SWIG เพื่อห่อไลบรารีเพื่อสร้างรหัสอัตโนมัติจากนั้นลองใช้คำหลักที่สร้างโดยอัตโนมัติในรุ่นนั้นคำหลักนั้นจะวางโค้ดผิดที่ใน Swig _wrap ของคุณ ไฟล์. cxx ... ดังนั้นคุณต้องย้ายไปไว้ในบล็อก "extern C":
อัปเดต: 15 ตุลาคม 2017
ฉันจะสะเพร่าถ้าฉันไม่ได้พูดถึงว่า Android Studio 2.2 เป็นต้นไปมีการสนับสนุน 'ดั้งเดิม' (ไม่เล่นสำนวน) สำหรับ NDK toolchain ผ่าน Gradle และ CMake ตอนนี้เมื่อคุณสร้างโครงการใหม่เพียงแค่เลือกการสนับสนุน C ++ และคุณก็พร้อมที่จะไป
คุณจะต้องสร้างรหัสเลเยอร์ JNI ของคุณเองหรือใช้เทคนิค SWIG ที่ฉันได้กล่าวถึงข้างต้น แต่การนั่งร้านของ C ++ ในโครงการ Android นั้นเป็นเรื่องเล็กน้อย
การเปลี่ยนแปลงในไฟล์ CMakeLists (ซึ่งเป็นที่ที่คุณวางไฟล์ต้นฉบับ C ++) จะถูกเลือกโดย Android Studio และจะรวบรวมไลบรารีที่เกี่ยวข้องอีกครั้งโดยอัตโนมัติ