เขียนแอปพลิเคชันใน C หรือ C ++ สำหรับ Android หรือไม่ [ปิด]


286

ฉันกำลังพยายามพัฒนา / ย้ายเกมไปยัง Android แต่อยู่ใน C และ Android รองรับ Java แต่ฉันแน่ใจว่าต้องมีวิธีในการรับแอป C ที่นั่นทุกคนรู้วิธีที่จะทำสิ่งนี้ให้สำเร็จหรือไม่


เฉพาะในกรณีที่คุณแหกคุก AFAIK โทรศัพท์
Cogsy

64
การเจลเบรคสำหรับ iPhone ไม่ใช่หรือ
Robert Gould

1
G1 ไม่อนุญาตการเข้าถึงรูทตามค่าเริ่มต้นและมีข้อ จำกัด มากมายเกี่ยวกับสิ่งที่สามารถดำเนินการได้นอกสภาพแวดล้อม 'Android' ฉันไม่มีความหวังมากที่จะหาวิธีเรียกใช้งานโค้ดเนทีฟจากภายใน Android
Cogsy

2
แต่ฉันดาวน์โหลด DOOM สำหรับ Android จากตลาดแล้ว ดังนั้นควรจะทำได้
Robert Gould

4
DOOM สำหรับ Android เขียนด้วย Java code.google.com/p/doom-for-android/source/browse/#svn/trunk
Marco Mustapic

คำตอบ:


247

สำหรับใครก็ตามที่เข้ามาทาง Google โปรดทราบว่าการเริ่มต้นจาก SDK 1.6 Android ตอนนี้มี SDK ดั้งเดิมอย่างเป็นทางการแล้ว

คุณสามารถดาวน์โหลด Android NDK (Native Development Kit) ได้จากที่นี่: https://developer.android.com/ndk/downloads/index.html

นอกจากนี้ยังมีโพสต์บล็อกเกี่ยวกับ NDK:
http://android-developers.blogspot.com/2009/06/introducing-android-15-ndk-release-1.html


5
ตกลงดังนั้นตอนนี้ C # และ. Net เป็นอย่างไร -)
Avi

4
ไม่สามารถเห็นการสนับสนุน. net เกิดขึ้นได้เลย
vickirk


2
โปรดอ้างอิงลิงค์นี้androidsnippets.wordpress.com/2012/08/30/…
KK_07k11A0585

2
สำหรับ. net / c # code และ android ลองดู xamarin
bbqchickenrobot

41

Android NDKเป็นชุดเครื่องมือที่ช่วยให้คุณใช้ชิ้นส่วนของแอปในรหัสพื้นเมืองโดยใช้ภาษาเช่น C และ C ++ ได้ สำหรับแอพบางประเภทสิ่งนี้สามารถช่วยให้คุณใช้ไลบรารีโค้ดที่เขียนด้วยภาษาเหล่านั้นได้อีกครั้ง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเริ่มต้นกับการพัฒนาดั้งเดิมให้ไปที่ลิงค์นี้

ตัวอย่างการใช้งานที่สามารถพบได้ที่นี่


1
หรือ 2009, 2010, 2011, 2012 หรือ 2013
Christopher Berman

19

โดยปกติคุณจะต้อง:

  1. ติดตั้ง Google Android NDK มันมี libs, ส่วนหัว, ตัวอย่าง makfile และ gcc toolchain
  2. สร้างปฏิบัติการจากรหัส C ของคุณสำหรับ ARM เพิ่มประสิทธิภาพและเชื่อมโยงกับ libs ที่ให้ไว้หากจำเป็น
  3. เชื่อมต่อกับโทรศัพท์โดยใช้อินเทอร์เฟซ adb ที่ให้มาและทดสอบปฏิบัติการของคุณ

หากคุณต้องการขายแอพ:

  1. สร้างห้องสมุดจากรหัส C ของคุณ
  2. สร้างรหัส Java อย่างง่ายซึ่งจะใช้ไลบรารีนี้
  3. ฝังไลบรารีนี้ลงในไฟล์แอปพลิเคชันแพคเกจ
  4. ทดสอบแอปของคุณ
  5. ขายหรือแจกจ่ายฟรี

ฉันใหม่ใน NDK และฉันต้องการเรียกใช้ C lan ใน Android.h มีลิงก์อ้างอิงใด ๆ
Parag Chauhan

14

Google ได้เปิดตัว Native Development Kit (NDK) (อ้างอิงจากhttp://www.youtube.com/watch?v=Z5whfaLH1-Eเวลา 00:07:30)

หวังว่าข้อมูลจะได้รับการอัปเดตในหน้ากลุ่ม google ( http://groups.google.com/group/android-ndk ) ตามที่ระบุว่ายังไม่ได้เปิดตัว

ฉันไม่แน่ใจว่าจะดาวน์โหลดได้ที่ไหน แต่ฉันได้ยินมาว่าคุณสามารถรับ NDK ได้จากที่เก็บ Git ของ Google ภายใต้สาขาโดนัท


12

ตำแหน่งทางการดูเหมือนว่าจะไม่ใช่สิ่งที่คุณต้องการ "อยากทำ" ดูหัวข้อนี้ในรายการนักพัฒนา Android Google มองเห็น android ที่ใช้อุปกรณ์ต่าง ๆ (ซีพียูจอแสดงผล ฯลฯ ) วิธีที่ดีที่สุดในการเปิดใช้งานการพัฒนาคือการใช้รหัสที่จัดการ (พกพา) ที่กำหนดเป้าหมาย Dalvik VM ด้วยเหตุผลนี้ Android SDK จึงไม่รองรับ C / C ++

แต่ดูที่หน้านี้ :

Android มีชุดของไลบรารี C / C ++ ที่ใช้โดยคอมโพเนนต์ต่าง ๆ ของระบบ Android ความสามารถเหล่านี้ถูกเปิดเผยต่อนักพัฒนาผ่านกรอบแอปพลิเคชัน Android

เฟรมเวิร์กแอปพลิเคชันที่ได้รับการจัดการนั้นดูเหมือนจะอยู่ด้านบนสุดของไลบรารีเหล่านี้ หน้าเว็บจะแสดงรายการ C / C ++ libs: ไลบรารี C มาตรฐาน, สื่อ, 3D, SQL lite และอื่น ๆ

ดังนั้นสิ่งที่คุณต้องมีคือคอมไพเลอร์เชนที่จะรวบรวม C / C ++ ให้กับ CPU ที่เหมาะสม (ARM ในกรณีของ G1) บางคำแนะนำสั้น ๆ เกี่ยวกับวิธีการทำเช่นนี้มีที่นี่

สิ่งที่ฉันไม่รู้ก็คือจะหาคำอธิบายของ API ที่ห้องสมุดเหล่านี้มีให้ได้ที่ไหน ฉันเดาว่าอาจมีไฟล์ส่วนหัวฝังอยู่ใน SDK อยู่ที่ไหนสักแห่ง แต่เอกสารอาจจะขาดหายไป แต่ฉันคิดว่ามันสามารถทำได้!

หวังว่ามีประโยชน์ สำหรับบันทึกแล้วฉันยังไม่ได้เขียนแอพพลิเคชั่น Android ของตัวเองเลย

แอนดี้


4
downvoting NDK ดูเหมือนจะเป็นคอมไพเลอร์อย่างเป็นทางการสำหรับรหัสเนทีฟ Android ในขณะนี้ ทำให้คำตอบนี้ล้าสมัย
unixman83

8

คุณสามารถใช้nestedvmเพื่อแปลภาษา C (หรือภาษา GCC อื่น ๆ ) เป็น Java bytecode และใช้สิ่งนั้นเป็นพื้นฐานของพอร์ตของคุณ ยกตัวอย่างเช่นดูพอร์ต Android ของไซมอน Tathams คอลเลกชันปริศนาแบบพกพา

ฉันคาดหวังว่าวิธีการนี้จะทำให้ล้าสมัยโดย NDK แต่อาจไม่ได้อยู่ในบางเครือข่ายหรือบางสิ่งบางอย่างไม่อนุญาตให้ผู้คนอัพเกรดโทรศัพท์ของพวกเขา


1
+1 เพื่อเป็นทางเลือกให้กับ NDK แม้ว่า NDK จะทำให้ล้าสมัย
tobsen

ไม่ซ้อนกัน vm กับอุปกรณ์เพิ่มเติมหรือไม่
charo

8

Google ได้เปิดตัวGoogle I / O 2011 แล้ว: นำเกม C และ C ++ ไปยัง Androidซึ่งมีให้ที่http://www.youtube.com/watch?v=5yorhsSPFG4

ซึ่งเป็นสิ่งที่ดีที่จะเข้าใจการใช้ NDK สำหรับการเขียนแอปพลิเคชันใน c และ c ++ สำหรับ Android

หากคุณเพียงต้องการรวบรวมเกมพื้นเมืองที่ใช้คอนโซลและรันบน Android แล้วบทความนี้ได้แสดงวิธีการ 3 วิธีสำหรับสิ่งเดียวกัน

1: การรวบรวมแบบคงที่โดยใช้ toolchain แบบสแตนด์อโลน

2: การคอมไพล์ข้ามโดยใช้ toolchain ของ Android NDK

3: การคอมไพล์ข้ามโดยใช้ซอร์สโค้ด AOSP


7

บางทีคุณกำลังมองหาสิ่งนี้?

http://www.mosync.com/

เป็นเลเยอร์กลางสำหรับการพัฒนาสำหรับแพลตฟอร์มมือถือหลาย ๆ เครื่องโดยใช้ c ++


2
ลิงก์ 404 ไม่พบ เป็นความคิดที่ดีที่จะใส่เนื้อหาบางส่วนจากโพสต์ต้นฉบับลงในคำตอบในกรณีที่เจ้าของเว็บไซต์ชนะลอตเตอรีหย่าภรรยาของเขาและย้ายไปบาฮามาส
Zuzlx

7

ดูที่นี่ดูเหมือนว่าจะเป็นไปได้:

"ความจริงก็คือภาษาจาวาเท่านั้นที่รองรับไม่ได้หมายความว่าคุณไม่สามารถพัฒนาแอปพลิเคชั่นในภาษาอื่น ๆ ได้ซึ่งได้รับการพิสูจน์โดยนักพัฒนาแฮกเกอร์และผู้เชี่ยวชาญในการพัฒนาแอปพลิเคชั่นมือถือหลาย ๆ คนที่ Elements Interactive BV บริษัท หลัง Edgelib ไลบรารี่ประสบความสำเร็จในการรันแอพพลิเคชั่น C ++ บนแพลตฟอร์ม Android แม้ในขณะนี้ยังมีปัญหามากมายเกี่ยวกับการแสดงและเสียง ... เป็นต้นซึ่งรวมถึงเกม S-Tris2 และการสาธิตภาพเคลื่อนไหว 3 มิติของ Edgelib "




5

ฉันไม่แน่ใจ NDK ให้ความคุ้มครองเต็มรูปแบบของ Java API อย่างเป็นทางการ

จากhttp://developer.android.com/sdk/ndk/index.html#overview :

โปรดทราบว่า NDK ไม่ได้ช่วยให้คุณพัฒนาแอปพลิเคชั่นที่มีในเครื่องเท่านั้น รันไทม์หลักของ Android ยังคงเป็นเครื่องเสมือนของ Dalvik




2

ฉันไม่ทราบเกี่ยวกับการสอน แต่เป็นเครื่องมือในการพัฒนาที่ดี: Airplay SDK จาก Ideaworks Labs (เปลี่ยนโฉมใหม่เมื่อเร็ว ๆ นี้ " Marmelade ") การใช้ C / C ++ คุณสามารถสร้างแอพสำหรับ Windows Mobile, iPhone, Android องค์ประกอบเดียวที่ฉันไม่ชอบคือนักแต่ง GUI - รถบักกี้ แต่คุณสามารถทดแทนมันได้ด้วย Notepad


2

คุณสามารถดาวน์โหลด c4droid แล้วติดตั้งปลั๊กอิน GCC และติดตั้งลงใน SD ของคุณ จาก shell ฉันไปที่ไดเรคทอรีที่เป็น GCC binary แล้วเรียกมันว่าสร้างปฏิบัติการบนบอร์ด

หา / - ​​ชื่อgcc

/mnt/sdcard/Android/data/com.n0n3m4.droidc/files/gcc/bin/arm-linux-androideabi-gcc

cat> test.c

#include<stdio.h>
int main(){ 
 printf("hello arm!\n");
return 0;
}

./arm-linux-androideabi-gcc test.c -o test

./ทดสอบ

สวัสดีแขน!



2

ไฟล์ C / c ++ ดั้งเดิม libstdc ++. * จาก Ubuntu ของคุณคือไบนารี x86 (หรือ x86_64) แต่อุปกรณ์ Android และอีมูเลเตอร์เป็น ARM แน่นอนว่านี่จะไม่ทำงานแม้ว่าคุณจะตั้งค่า soname ที่ถูกต้องก็ตาม นี่เป็นวิธีที่ไร้เดียงสาอย่างมาก Android ได้รับการสนับสนุนอย่าง จำกัด ของ C ++ หมายถึงไม่มีข้อยกเว้นไลบรารี C ++ มาตรฐาน (รวมถึง STL) และ RTTI หากคุณต้องการฟังก์ชั่นดังกล่าวให้ใช้การกระจาย NDK ของฉันเอง

http://crystax.net/android/ndk.php - รองรับคุณสมบัติ C ++ ทั้งหมดตามรายการด้านบน

เหตุใดจึงมีข้อผิดพลาด: ไม่ได้กำหนดการอ้างอิงถึงข้อผิดพลาดการเชื่อมโยง '__cxa_end_cleanup' Android stlport

เวลา. เนื่องจากไม่มีลิงก์ไปยัง libstdc + + A. ผิด

เนื่องจากใช้ไลบรารีแบบคงที่บางตัวจึงจำเป็นต้องเชื่อมโยง libstdc + + แบบเต็ม กระป๋อง

http://crystax.net/android/ndk.phpที่นี่เพื่อดาวน์โหลดแพ็คเกจ

ไดเรกทอรี \ cxx-stl \ gnu-libstdc + + \ libs \ armeabi

Android บนการสนับสนุน libstdc + + ของตัวเองนั้นถูก จำกัด มันจะต้องเชื่อมโยงกับ libstdc + + ที่สมบูรณ์ เป็นงาน

เพิ่มไฟล์ใน Android.mk LOCAL_LDFLAGS = $ (LOCAL_PATH) / libs / libcurl.a \

 $ (LOCAL_PATH) / libs / liblua.a \
 `$ (LOCAL_PATH) / libs / libstdc + +. A`  

และLOCAL_CPPFLAGS + =-lstdc + +-fexceptionsสามารถรวบรวมได้


1

มีแผนที่จะอนุญาตให้ใช้ไลบรารี C / C ++ ใน Android รุ่น SDK ถัดไป (Codename Eclair?) จนถึงวันนี้มันเป็นไปไม่ได้ผ่าน Android Java SDK อย่างไรก็ตามคุณสามารถคว้าโครงการโอเพ่นซอร์สขนาดใหญ่ม้วนห้องสมุดของคุณแล้วแฟลชอุปกรณ์ของคุณเอง ... แต่ใครก็ตามที่ต้องการใช้ห้องสมุดของคุณจะต้องสร้างงานสร้างของคุณเองเช่นกัน


-7

คำตอบสั้น ๆ : คุณทำไม่ได้

@ Backslash17: มองผ่านบทความและลิงค์ต่อไปนี้พร้อมคำแนะนำในการติดตั้ง บริษัท ทั้งหมดที่ทำงานก็คือการเปิดตัวปฏิบัติการที่คอมไพล์ด้วยตัวเองบนอีมูเลเตอร์โดยผ่านกรอบของ Android เมื่อคุณมีอีมูเลเตอร์คุณสามารถเทลเน็ตและมีเชลล์ลินุกซ์ แน่นอนว่าการรันโปรแกรม linux นั้นเป็นเรื่องเล็กน้อย แต่นั่นไม่ได้ผลสำหรับโทรศัพท์ที่ไม่มีการเจลเบรค (รู้จักการเข้าถึงรูท) และไม่สามารถส่งมอบได้ในตลาด

เว้นแต่ Google จะเปิดโอกาสอื่น ๆ หรือมีคนเขียนคอมไพเลอร์แบบกำหนดเองที่รวบรวม Language X ไปยัง Dalvik bytecode (Dalvik เป็น VM ที่ใช้งานโปรแกรม Android) คุณจะไม่สามารถเขียนโค้ดเนทีฟได้


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