เหตุใดแอป Android จึงไม่ควรเขียนด้วยภาษา C / C ++ เพราะคุณ "เพียงแค่ต้องการเขียนโปรแกรมใน C / C ++" [ปิด]


86

อัปเดตแล้ว (เพื่อความชัดเจนและลดความคลุมเครือ):

ฉันจะเริ่มซ่อมแซมแอพ Android ฉันวางแผนที่จะเขียนใน C ++ โดยใช้ NDK (เนื่องจากฉันมีประสบการณ์มากขึ้นใน C ++ และชอบใช้กับ Java) แต่เจอสิ่งต่อไปนี้ในหน้าAndroid NDK :

คุณควรใช้ NDK เฉพาะในกรณีที่จำเป็นต่อแอปของคุณเท่านั้น - ไม่ควรใช้เพราะคุณต้องการเขียนโปรแกรมใน C / C ++

ฉันรู้สึกว่าคุณควรใช้ภาษาที่คุณต้องการตราบเท่าที่มันเหมาะกับงาน ใครสามารถอธิบายได้ว่าทำไมจึงไม่แนะนำอย่างยิ่งที่จะไม่ใช้ C / C ++ สำหรับการพัฒนา Android?


ต้นฉบับ:

ฉันจะเริ่มซ่อมแซมแอพมือถือโดยเฉพาะ Android ซึ่งเป็นระบบปฏิบัติการของโทรศัพท์ปัจจุบันของฉันและฉันสงสัยว่าการเขียนแอปใน C ++ (หรืออย่างน้อยก็เป็นแกนหลักจากนั้นการรวมใน Java) เป็นตัวเลือกที่ยอมรับได้

พื้นฐานบางอย่างฉันเป็นวิชาเอกวิทยาการคอมพิวเตอร์ที่เรียนหลักสูตร C ++ 3 หลักสูตร (บทนำระดับกลาง OOP และกำลังเรียนหลักสูตร STL ในฤดูใบไม้ผลิ) และหลักสูตร Java เพียง 1 หลักสูตร (ระดับกลาง) ด้วยเหตุนี้ฉันจึงคุ้นเคยกับ C ++ มากกว่าและชอบใช้ Java มากกว่า ฉันเจอสิ่งต่อไปนี้ในหน้าAndroid NDK :

การใช้โค้ดเนทีฟบน Android โดยทั่วไปไม่ได้ส่งผลให้ประสิทธิภาพดีขึ้นอย่างเห็นได้ชัด แต่จะเพิ่มความซับซ้อนของแอปเสมอ โดยทั่วไปคุณควรใช้ NDK เฉพาะในกรณีที่จำเป็นต่อแอปของคุณ - ไม่ควรใช้เพราะคุณเพียงแค่ต้องการเขียนโปรแกรมใน C / C ++

  • ฉันรู้สึกว่าคุณควรใช้ภาษาที่เหมาะกับงานและเป็นภาษาที่คุณคุ้นเคยด้วย
  • ฉันอาจต้องการพอร์ตแอปพลิเคชันไปยังแพลตฟอร์มมือถืออื่นเช่น iOS ที่รองรับ C ++ แต่ไม่ใช่ java
  • แม้ว่า Java จะเป็นภาษาระดับสูงและควรทำให้การพัฒนาเร็วขึ้น แต่ฉันรู้สึกว่าการพัฒนาจะช้าลงเพราะฉันจะต้องเรียนรู้เกือบทุกอย่าง (เนื่องจากฉันเรียนภาษาเดียวเท่านั้น)

คำแนะนำใด ๆ จะขอบคุณมาก

ps: หลาย ๆ คำตอบในเรื่องนี้มาจากปีที่แล้วและมีคำตอบติดตามน้อยมากที่กล่าวถึง NDK ที่อนุญาตให้พัฒนาแอพเนทีฟเต็มรูปแบบบน Android 2.3 และใหม่กว่า


1
"ยอมรับได้" เป็นคำที่แปลก - เป็นไปได้อย่างแน่นอนทางNDK ...
ildjarn

1
คุณอาจจะดีกว่าที่จะกัดกระสุนและเรียนรู้ Java ชุดเครื่องมือ Android มีไว้ให้ใช้จาก Java จริงๆและเวลาที่คุณจะประหยัดจากการรู้ว่า C ++ จะใช้ไปแล้วบางคนก็พยายามหาวิธีทำให้ทุกอย่างของ Android ทำงานจาก C ++ คิดว่านี่เป็นโอกาสในการเรียนรู้ :)
Jeremy Friesner

โดยส่วนตัวแล้วฉันจะกัดกระสุนตามที่ Jeremy พูดและเรียนรู้สิ่งที่คุณมีกับ Java มันจริงไม่ควรจะเป็นที่จัดการใหญ่สำหรับคุณที่จะเรียนรู้ว่ามันค่อนข้างรวดเร็ว
OmniOwl

สำหรับจุดแรกของคุณ C ++ ไม่เหมาะกับงาน (ที่พัฒนาสำหรับ Android) เกือบพอ ๆ กับที่ Java ทำโดยไม่คำนึงถึงความคุ้นเคย สำหรับจุดที่สองของคุณแม้ว่า Android จะเป็น Linux แต่ก็มีความแตกต่างอย่างมากระหว่างแอป Android และเดสก์ท็อป วงจรชีวิตแตกต่างกันและคุณต้องจัดการกับกิจกรรมแทนที่จะเป็นกระบวนการซึ่งเป็นวิธีการพัฒนาที่แตกต่างอย่างสิ้นเชิงเมื่อเทียบกับการพัฒนาเดสก์ท็อปปกติ สำหรับประเด็นที่สามของคุณการเรียนรู้ Android SDK ใน C ++ จะใช้เวลานานกว่าที่จะเรียนรู้ใน Java ก่อน (หลังจากเรียนรู้ Java) จากนั้นจึงเปลี่ยนไปใช้ C ++
Cornstalks

1
มีคนจำนวนมากเกินไปที่ใช้คำว่า "C / C ++" ราวกับว่ามีภาษาเดียวในชื่อนั้น ฉันหวังว่าคุณจะทราบว่า C และ C ++ เป็นภาษาที่แตกต่างกันสองภาษา (แม้ว่าจะเกี่ยวข้องกันอย่างใกล้ชิด) - และดูเหมือนว่าจะเป็น C ++ ไม่ใช่ C ที่คุณกำลังถามถึง
Keith Thompson

คำตอบ:


107

คิดว่าวิธีนี้ คุณมีความสามารถในการใช้ Java SDK เพื่อสร้างแอปพลิเคชันที่ใช้งานได้เต็มรูปแบบซึ่งใช้ประโยชน์จาก API 100% ที่มีให้สำหรับนักพัฒนา ไม่มีอะไรที่คุณสามารถทำได้กับ NDK ที่ไม่สามารถทำได้ด้วย SDK (จากมุมมองของ API) NDK ให้ประสิทธิภาพที่สูงขึ้น

ตอนนี้ดูในทางกลับกัน หากคุณเลือกที่จะเขียนแอปพลิเคชัน 100% ใน NDK คุณยังสามารถเขียนแอปพลิเคชันที่ใช้งานได้เต็มรูปแบบ แต่คุณมีข้อ จำกัด ในจำนวน Framework API ที่คุณสามารถเข้าถึง ไม่สามารถเข้าถึงเฟรมเวิร์ก Android ทั้งหมดในเลเยอร์เนทีฟ API ส่วนใหญ่เป็น Java เท่านั้น นั่นคือไม่ได้บอกว่าทั้งหมด APIs คุณอาจต้องจะไม่สามารถใช้ได้ใน NDK แต่ไม่มีที่ไหนเลยใกล้ALL API ที่มีการสัมผัส

นอกเหนือจากนี้ NDK ยังแนะนำโค้ดเฉพาะแพลตฟอร์มซึ่งจะขยายขนาดการกระจายของคุณ สำหรับสถาปัตยกรรมอุปกรณ์ทั้งหมดที่คุณตั้งใจจะสนับสนุนโค้ดเนทีฟของคุณจะต้องสร้างไว้ในไฟล์. so (หนึ่งไฟล์สำหรับ armv5, armv7 และ x86) ทั้งหมดรวมอยู่ใน APK เดียวกัน การทำซ้ำโค้ดปฏิบัติการนี้ทำให้แอปของคุณมีขนาดเป็น 3 เท่า (เช่น "ไบนารีไขมัน") เว้นแต่คุณจะทำหน้าที่สร้าง APK แยกกันสำหรับสถาปัตยกรรมแต่ละแบบเมื่อคุณแจกจ่ายแอปพลิเคชัน ดังนั้นขั้นตอนการทำให้ใช้งานได้จะทำงานได้มากขึ้นหากคุณไม่ต้องการให้ APK ของคุณมีขนาดใหญ่ขึ้นอย่างมาก

อีกครั้งแม้ว่าสิ่งนี้จะไม่ห้ามไม่ให้คุณทำในสิ่งที่คุณเลือก แต่ก็ชี้ให้เห็นว่าเหตุใด Google จึงอธิบาย Java ว่าเป็นวิธี "ที่ต้องการ" สำหรับโค้ดส่วนใหญ่ของคุณและเป็นเส้นทางที่มีการต่อต้านน้อยที่สุด ฉันหวังว่ามันจะช่วยให้กระจ่างว่าเหตุใดเอกสารจึงมีคำในแบบที่เป็นอยู่


1
ขอบคุณมาก! การเปลี่ยนมุมมองเป็นส่วนสำคัญที่ฉันขาดหายไป ฉันไม่ทราบว่า NDK ขาด API บางตัว ฉันยังไม่ได้คิดถึงขนาดของการกระจาย แต่ตอนนี้มันสมเหตุสมผลแล้วที่คุณนึกถึง (โดยเฉพาะอย่างยิ่งเพราะ c ++ ต้องรวมไลบรารีมาตรฐานทั้งหมดในขณะที่ไลบรารีมาตรฐานของ java อยู่ในอุปกรณ์แล้ว) คุณช่วยอธิบายเล็กน้อยเกี่ยวกับ.soไฟล์ได้ไหม ฉันทราบว่าจำเป็นต้องมีการรวบรวมโค้ดเนทีฟแยกต่างหากสำหรับสถาปัตยกรรมฮาร์ดแวร์แต่ละตัวที่รองรับดังนั้นแต่ละ.soไฟล์จึงมีการคอมไพล์แยกกัน?
Logan Besecker

43
ข้อ จำกัด ของ NDK นั้นน่าเสียดายจริงๆ ฉันชอบที่จะเขียนโค้ดประสิทธิภาพสูงสำหรับแพลตฟอร์มมือถือเนื่องจากคำนึงถึงอายุการใช้งานแบตเตอรี่เป็นหลัก พื้นเมืองเรื่องบนแพลตฟอร์มมือถือ ทำไมไม่สนับสนุนให้ดีกว่านี้ # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph

2
@LoganBesecker NDK toolchain จะคอมไพล์โค้ดของคุณข้ามไปยัง.soสถาปัตยกรรมแต่ละแบบที่คุณเลือกรองรับ (ซึ่งควบคุมโดย makefiles ของคุณ) และไฟล์ทั้งหมดจะถูกวางไว้ใน libs / directory ของ APK ของคุณ เมื่อติดตั้ง APK แล้วระบบ.soจะเลือกเฉพาะที่เหมาะสมแต่ทั้งหมดยังคงต้องใช้งานอยู่ใน APK เริ่มต้น
devunwired

1
@KonradRudolph คุณสามารถเขียนบางส่วนของแอพของคุณด้วย ndk Google ทำสิ่งนี้เพื่อประสิทธิภาพส่วนสำคัญของ Android ยกเว้นกรณีที่เฉพาะเจาะจงมาก c ++ vs java ไม่เกี่ยวข้องกับการพัฒนา Android โดยเฉพาะอย่างยิ่งตอนนี้ ART กำลังมา การใช้ API อย่างถูกต้องโดยเฉพาะที่ใช้แบตเตอรี่ (GPS, เครือข่าย) เป็นสิ่งที่คุณต้องระวัง
Teovald

1
Java ช้ากว่า JVM จำเป็นต้องโหลดบวกไบต์โค้ดมีประสิทธิภาพมาก แต่ไม่ใช่ "เนทีฟ" และด้วยเหตุนี้จึงมีโทษเล็กน้อย - ขึ้นอยู่กับแอปพลิเคชันซึ่งอาจสังเกตเห็นได้ เหตุใดพวกเขาจึงเลือก Java โดยเฉพาะเนื่องจากรันในล่าม: ตัวรวบรวมขยะช่วยลดปัญหาหน่วยความจำและลดผลกระทบข้ามแอป นอกจากนี้ภาษา Java (ในขณะที่ verbose) ยังลบนักพัฒนาหลายคนที่แนะนำข้อผิดพลาดของ C ++
Daniel

25

หากคุณกำลังจะพัฒนาแอพเดียวในชีวิตให้ใช้ NDK

หากคุณมุ่งเป้าไปที่การเรียนรู้การพัฒนา Android โดยมีความตั้งใจที่จะพัฒนาแอปพลิเคชันมากกว่าหนึ่งแอปพลิเคชันในช่วงชีวิตของคุณ - และต้องการให้สามารถสนับสนุนแอปพลิเคชันทั้งหมดได้อย่างเหมาะสมคุณมีแนวโน้มที่จะทำได้ดีขึ้นในระยะยาวหากคุณเรียนรู้ Java และ ใช้ Java SDK ของ Android แทน


ตรรกะนี้ทำให้เกิดความรู้สึกในทางปฏิบัติมาก
vvnraman

8

โปรแกรมเมอร์ของ King ใช้ C ++ สำหรับตรรกะของเกม และดูเหมือนว่าพวกเขาจะตัดสินได้ดีจากผลประกอบการของพวกเขา

จากประสบการณ์ของฉัน C ++ มีไว้สำหรับผู้แก้ปัญหาและ Java มีไว้สำหรับผู้หลีกเลี่ยงปัญหา ฉันชอบทั้งสองภาษา แต่ C ++ ค่อนข้างคุ้มค่าเมื่อคุณเขียนโค้ดที่ดี อย่างไรก็ตามอาจใช้เวลาสักครู่เพื่อไปที่นั่น

คุณสามารถแนะนำ C ++ สำหรับนักวิทยาศาสตร์ด้านข้อมูลได้เช่นกันซึ่งโดยปกติแล้ว Python หรือ R. นั่นคือเหตุผลที่ฉันไม่เคยไม่แนะนำ C ++ ให้กับคนที่ต้องการทำ - ฉันแค่ให้ความสำคัญกับการปฏิบัติที่พวกเขากำลังทำอยู่


2
ทุกครั้งที่คุณใช้แก้ปัญหาที่เป็นเอกลักษณ์ของ C ++ คือเวลาที่คุณสามารถใช้สร้างฟังก์ชันการทำงานจริงของแอปได้
user45623

4

ฉันพบบทความที่น่าสนใจนี้จาก: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ ถูกสร้างขึ้นโดยเฉพาะเพื่อความเป็นอิสระของแพลตฟอร์มและพบได้ในทุกระบบปฏิบัติการที่มีอยู่ ผู้ใช้มือถือทั่วไปของคุณอาจทราบว่าแอป Android เขียนแอป Java และ iOS ใน Objective-C แต่สิ่งที่หลายคนไม่รู้คือมีรหัส C / C ++ ในหน่วยความจำบนอุปกรณ์ของคุณมากกว่าสิ่งอื่น C / C ++ ขับเคลื่อนเทคโนโลยีส่วนใหญ่ของอุปกรณ์ขนาดเล็ก (เช่นเคอร์เนลซึ่งโต้ตอบกับฮาร์ดแวร์ตลอดจนไลบรารีรันไทม์ทั่วไป) และเครือข่ายโทรคมนาคมที่เปิดใช้งานอุปกรณ์เหล่านี้ ที่สำคัญกว่าสำหรับทีมพัฒนาคือมีอินเทอร์เฟซและไลบรารี C / C ++ สำหรับทุกสิ่งที่คุณต้องทำบนอุปกรณ์และแพลตฟอร์มใด ๆ ชุดเครื่องมือ Android NDK เป็นตัวอย่างที่ยอดเยี่ยมของการรองรับ C / C ++ เต็มรูปแบบที่เพิ่มมาสำหรับทีมพัฒนาเกมเพื่อให้พวกเขาได้รับประสิทธิภาพที่ดีที่สุดจากอุปกรณ์โดยหลีกเลี่ยง Java และรันไทม์ Android Java Dalvik ซึ่งเป็นเครื่องเสมือนที่ รหัส Java ของ Android ถูกเรียกใช้งานบน ได้รับการปรับปรุงอย่างสม่ำเสมอเพื่อเปิดใช้งานบริการ Android ทั้งหมด


3

ฉันจะบอกว่าใช้ java สำหรับแอพหลัก แต่ถ้าคุณมีโค้ด c ++ ที่คุณต้องพอร์ตหรือไลบรารีบางตัวที่คุณต้องการซึ่งใช้งานได้อย่างมีประสิทธิภาพใน c ++ ให้ใช้ ndk สำหรับบิตเหล่านั้น


4
ทำไมเขาถึงต้องใช้ Java?
Vladislav Rastrusny

3

ฉันไม่เห็นเหตุผลใด ๆ ที่จะไม่ใช้ C ++ สำหรับการพัฒนา Android ปกติหากคุณมีประสบการณ์มากมายในการทำงานใน C ++ และด้วยระบบปฏิบัติการที่ซับซ้อนเช่น windows หรืออื่น ๆ คุณสามารถเข้าใจ android ได้อย่างรวดเร็วและไม่ซับซ้อนเท่า OS อื่น ๆ คือ ในขณะที่เรียนรู้ java หรือทำงานโดยไม่เรียนรู้มันจะน่าผิดหวังและซับซ้อนกว่านี้!


3

ข้อพิจารณาที่สำคัญที่สุดคือโค้ด Java ที่คอมไพล์แล้วจะทำงานบนอุปกรณ์ Android ทั้งหมดโดยไม่มีการเปลี่ยนแปลงในขณะที่โค้ดเนทีฟจะต้องได้รับการคอมไพล์สำหรับแพลตฟอร์มเป้าหมายทั้งหมด

จุดประสงค์ทั่วไปสำหรับทั้ง Java และ Android คือคุณเขียนส่วนใหญ่หากไม่ใช่แอปทั้งหมดของคุณใน Java และใช้สิ่งที่เป็นภาษาเนทีฟเฉพาะเมื่อไม่มีตัวเลือกอื่น ... ดังนั้นทุกอย่างเกี่ยวกับการเขียนแอปจะยืมตัวเองไปทำใน Java

คุณจะประหยัดเวลาในการทำให้ตัวเองแย่ลงในการเชื่อมระหว่างโลกดั้งเดิมและโลก Java ด้วยการเขียนเป็นภาษา Java

เช่นกันคุณจะได้รับความโปรดปรานอย่างมากหากคุณดำดิ่งและเรียนรู้ Java ไม่เพียง แต่แอป Android ของคุณจะดีขึ้นเท่านั้น แต่คุณจะได้สัมผัสกับแนวทางที่แตกต่างไปจาก OO อย่างเห็นได้ชัดและคุณจะเป็นโปรแกรมเมอร์ที่ดีขึ้น

เพิ่มความจริงที่ว่าคุณจะก้าวข้ามความเสี่ยงด้านความปลอดภัยทั้งหมดโดยเขียนเป็นภาษา Java

ในความคิดของฉันนี่ไม่ใช่เกมง่ายๆ - ใช้ Java


2
"... และใช้ของพื้นเมืองก็ต่อเมื่อไม่มีตัวเลือกอื่น". ไม่มีทางเลือกอื่นได้เมื่อใด ทุกอย่างบน Android สามารถทำได้ผ่าน Java!
CinCout
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.