Tại sao một ứng dụng Android không nên được viết bằng C / C ++ vì bạn “chỉ đơn giản là thích lập trình bằng C / C ++”? [đóng cửa]


86

Đã cập nhật (để rõ ràng và giảm sự mơ hồ):

Tôi sẽ bắt đầu mày mò với các ứng dụng Android. Tôi đã dự định viết bằng C ++ bằng NDK (vì tôi có nhiều kinh nghiệm hơn về C ++ và thích nó hơn Java) nhưng lại gặp phải những điều sau trên trang NDK của Android :

bạn chỉ nên sử dụng NDK nếu nó cần thiết cho ứng dụng của bạn— không bao giờ vì bạn chỉ thích lập trình bằng C / C ++.

Tôi có ấn tượng rằng bạn nên sử dụng ngôn ngữ mà bạn thích, miễn là nó phù hợp với công việc. Ai đó có thể giải thích tại sao rất nhiều người khuyên không nên sử dụng C / C ++ để phát triển Android?


Nguyên:

Tôi sẽ bắt đầu mày mò với các ứng dụng dành cho thiết bị di động, cụ thể là android, là hệ điều hành của điện thoại hiện tại của tôi và tôi đã tự hỏi liệu viết ứng dụng bằng C ++ (hoặc ít nhất là lõi, sau đó gói bằng Java) có phải là một lựa chọn chấp nhận được không.

Thông tin cơ bản, tôi là sinh viên chuyên ngành khoa học máy tính, đã học 3 khóa học C ++ (giới thiệu, trung cấp, OOP và đang tham gia một khóa học STL vào mùa xuân) và chỉ 1 khóa học Java (trung cấp). Vì điều này, tôi cảm thấy thoải mái hơn với C ++ và thích nó hơn Java. Tôi đã xem những điều sau trên trang NDK của Android :

Sử dụng mã gốc trên Android thường không dẫn đến cải thiện hiệu suất đáng chú ý, nhưng nó luôn làm tăng độ phức tạp của ứng dụng của bạn. Nói chung, bạn chỉ nên sử dụng NDK nếu nó cần thiết cho ứng dụng của bạn— không bao giờ vì đơn giản là bạn thích lập trình bằng C / C ++.

  • Tôi có ấn tượng rằng bạn nên sử dụng ngôn ngữ phù hợp với công việc cũng như ngôn ngữ bạn quen thuộc
  • Tôi có thể muốn chuyển ứng dụng sang một nền tảng di động khác, chẳng hạn như iOS, hỗ trợ C ++ nhưng không hỗ trợ java
  • Mặc dù Java là một ngôn ngữ cấp cao và do đó sẽ làm cho việc phát triển nhanh hơn, nhưng tôi cảm thấy rằng sự phát triển sẽ chậm hơn vì tôi sẽ phải học lại hầu hết mọi thứ (vì tôi chỉ học một lớp về ngôn ngữ này)

Bất kỳ lời khuyên sẽ được đánh giá cao.

ps: nhiều câu trả lời về chủ đề này là từ nhiều năm trước và có rất ít câu trả lời tiếp theo đề cập đến NDK cho phép phát triển các ứng dụng gốc đầy đủ trên Android 2.3 và mới hơn.


1
"Có thể chấp nhận" là một từ kỳ quặc - chắc chắn là có thể , thông qua NDK ...
ildjarn

1
Có lẽ bạn nên cắn đạn và học Java. Bộ công cụ Android thực sự được thiết kế để sử dụng từ Java, và thời gian bạn tiết kiệm được từ việc biết C ++ sẽ được sử dụng và sau đó một số cố gắng tìm ra cách làm cho tất cả nội dung Android hoạt động từ C ++. Hãy coi đây là một cơ hội học tập :)
Jeremy Friesner

Cá nhân tôi sẽ cắn viên đạn như Jeremy đã nói và chỉ đơn giản là tìm hiểu những gì bạn phải làm với Java. Nó thực sự không nên một vấn đề lớn để bạn có thể tìm hiểu nó tương đối nhanh.
OmniOwl

Đối với điểm đầu tiên của bạn, C ++ không phù hợp với công việc (phát triển cho Android) gần giống như Java, bất kể sự quen thuộc. Đối với điểm thứ hai của bạn, mặc dù Android là Linux, có một sự khác biệt rất lớn giữa ứng dụng Android và máy tính để bàn; Các vòng đời là khác nhau và bạn phải xử lý các hoạt động thay vì các quy trình, đây là một cách phát triển hoàn toàn khác so với phát triển máy tính để bàn thông thường. Đối với điểm thứ ba của bạn, học SDK Android trong C ++ sẽ khiến bạn mất nhiều thời gian hơn đáng kể so với việc học nó trong Java trước (sau khi học Java), và sau đó chuyển sang C ++.
Cornstalks

1
Quá nhiều người sử dụng thuật ngữ "C / C ++" như thể có một ngôn ngữ duy nhất của tên đó. Tôi hy vọng bạn biết rằng C và C ++ là hai ngôn ngữ khác nhau (mặc dù có liên quan chặt chẽ) - và nó có vẻ là C ++, không phải C, mà bạn đang hỏi.
Keith Thompson

Câu trả lời:


107

Nghĩ theo cách này. Bạn có khả năng sử dụng Java SDK để xây dựng một ứng dụng hoạt động đầy đủ tận dụng 100% API có sẵn cho các nhà phát triển. Bạn không thể làm gì với NDK mà không thể làm với SDK (từ góc độ API), NDK chỉ cung cấp hiệu suất cao hơn.

Bây giờ hãy nhìn ngược lại. Nếu bạn chọn viết ứng dụng 100% trong NDK, bạn vẫn có thể viết ứng dụng đầy đủ chức năng, nhưng bạn bị giới hạn về số lượng API khung mà bạn có thể truy cập. Không phải tất cả các khuôn khổ Android đều có thể được truy cập ở lớp gốc; hầu hết các API chỉ là Java. Điều đó không có nghĩa là tất cả các API BẠN có thể cần không có sẵn trong NDK, nhưng không nơi nào gần TẤT CẢ API được hiển thị.

Ngoài ra, NDK còn giới thiệu mã dành riêng cho nền tảng giúp mở rộng quy mô phân phối của bạn. Đối với mọi kiến ​​trúc thiết bị mà bạn định hỗ trợ, mã gốc của bạn phải được tích hợp vào các tệp .so (một cho armv5, armv7 và x86), tất cả đều được đóng gói thành cùng một APK. Việc trùng lặp mã thực thi này làm cho ứng dụng của bạn có kích thước gấp 3 lần (tức là "nhị phân béo") trừ khi bạn đảm nhận nhiệm vụ xây dựng các APK riêng biệt cho từng kiến ​​trúc khi bạn phân phối ứng dụng. Vì vậy, quá trình triển khai trở nên vất vả hơn một chút nếu bạn không muốn APK của mình tăng kích thước đáng kể.

Một lần nữa, mặc dù không điều nào trong số này cấm bạn làm những gì bạn chọn, nhưng nó chỉ ra lý do tại sao Google mô tả Java là phương pháp "ưa thích" cho phần lớn mã của bạn và là con đường ít kháng cự nhất. Tôi hy vọng nó làm sáng tỏ lý do tại sao tài liệu được truyền đạt như vậy.


1
Cảm ơn rât nhiều! Sự thay đổi trong quan điểm là phần lớn tôi đã bỏ lỡ. Tôi không biết rằng NDK thiếu một số API. Tôi cũng không nghĩ về quy mô của phân phối; nhưng bây giờ bạn đã nghĩ đến nó có ý nghĩa rất nhiều (cụ thể là vì c ++ phải bao gồm tất cả các thư viện chuẩn trong khi các thư viện chuẩn của java đã có trên các thiết bị). Bạn có thể giải thích một chút về các .sotập tin? Tôi biết rằng cần phải có một biên dịch mã gốc riêng cho từng kiến ​​trúc phần cứng được hỗ trợ, vì vậy mỗi .sotệp có một biên dịch riêng biệt?
Logan Besecker

43
Hạn chế của NDK thực sự là một điều đáng tiếc. Tôi rất thích viết mã hiệu suất cao cho nền tảng di động, chủ yếu là vì cân nhắc về thời lượng pin. Vấn đề gốc trên nền tảng di động. Tại sao không hỗ trợ nó tốt hơn? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph

2
@LoganBesecker Chuỗi công cụ NDK sẽ biên dịch chéo mã của bạn thành một .sokiến trúc cho từng kiến ​​trúc bạn đã chọn để hỗ trợ (điều này được kiểm soát bởi các tệp makefiles của bạn) và tất cả các tệp sẽ được đặt vào thư mục libs / của APK của bạn. Khi APK được cài đặt, chỉ những APK thích hợp .sosẽ được chọn, nhưng tất cả chúng vẫn phải hoạt động trong APK ban đầu.
devunwired

1
@KonradRudolph bạn có thể viết các phần ứng dụng của mình bằng ndk, Google thực hiện điều này cho các phần quan trọng của Android. Ngoại trừ những trường hợp rất cụ thể, c ++ và java không liên quan trong quá trình phát triển Android, đặc biệt là khi ART sắp ra mắt. Việc sử dụng đúng các API, đặc biệt là các API ngốn pin (GPS, mạng) là điều bạn cần phải cẩn thận.
Teovald

1
Java chậm hơn. JVM cần tải, cộng với mã byte RẤT hiệu quả, nhưng nó không phải là "gốc", và do đó có một hình phạt nhỏ - tùy thuộc vào ứng dụng, điều này có thể đáng chú ý. Về lý do tại sao họ chọn Java, cụ thể là vì nó chạy trong một trình thông dịch: trình thu gom rác giúp giảm các vấn đề về bộ nhớ và giảm tác động giữa các ứng dụng. Ngoài ra, ngôn ngữ Java (trong khi dài dòng) loại bỏ nhiều lỗi do nhà phát triển giới thiệu về C ++.
Daniel

25

Nếu bạn chỉ định phát triển một ứng dụng trong đời, hãy sử dụng NDK.

Nếu bạn đang hướng tới việc học phát triển Android với ý định phát triển nhiều hơn một ứng dụng trong suốt cuộc đời của mình - và muốn có thể hỗ trợ tất cả chúng một cách chính xác - thì bạn rất có thể sẽ làm tốt hơn về lâu dài nếu bạn học Java và sử dụng Java SDK của Android để thay thế.


Logic này có rất nhiều ý nghĩa thực tế.
vvnraman

8

Các lập trình viên tại King sử dụng C ++ cho logic trò chơi của họ. Và có vẻ như họ đang làm tốt nếu xét theo doanh thu của họ.

Theo kinh nghiệm của tôi, C ++ dành cho người giải quyết vấn đề và Java dành cho người tránh sự cố. Tôi yêu một trong hai ngôn ngữ, nhưng C ++ khá bổ ích khi bạn viết mã tốt. Tuy nhiên, có thể chỉ mất vài phút thao tác để đạt được điều đó.

Bạn cũng có thể giới thiệu C ++ cho các nhà khoa học Dữ liệu, những người thường hoàn thành công việc của mình bằng Python hoặc R. C ++ có thể làm điều tương tự với hiệu suất tốt hơn hoặc không tốt hơn, nhưng chỉ cần là một thiên tài trong ngôn ngữ. Đó là lý do tại sao tôi chưa bao giờ không khuyên C ++ để một trong đó muốn làm điều đó - Tôi chỉ muốn cung cấp cho một người đứng đầu lên đến điều trị mà họ đang ở cho.


1
Bất cứ lúc nào bạn dành thời gian để giải quyết các vấn đề chỉ có trong C ++ là thời gian bạn có thể dành để xây dựng chức năng thực tế của ứng dụng của mình.
user45623

4

Tôi tìm thấy bài viết thú vị này từ: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ được xây dựng đặc biệt để độc lập nền tảng và như vậy được tìm thấy trên mọi hệ điều hành tồn tại. Người dùng di động thông thường của bạn có thể biết rằng ứng dụng Android được viết ứng dụng Java và iOS trong Objective-C, nhưng điều mà nhiều người không biết là có nhiều mã C / C ++ trong bộ nhớ trên thiết bị của bạn hơn bất kỳ thứ gì khác. C / C ++ thúc đẩy phần lớn công nghệ của các thiết bị nhỏ (như hạt nhân, tương tác với phần cứng, cũng như các thư viện thời gian chạy điển hình) và các mạng viễn thông cho phép các thiết bị này. Quan trọng hơn đối với một nhóm phát triển, là có các giao diện và thư viện C / C ++ cho mọi thứ bạn cần làm trên bất kỳ thiết bị và nền tảng nào. Bộ công cụ Android NDK là một ví dụ tuyệt vời về hỗ trợ C / C ++ đầy đủ đã được thêm vào ban đầu cho các nhóm phát triển trò chơi để cho phép họ đạt được hiệu suất tốt nhất có thể từ thiết bị bằng cách tránh Java và Android Java runtime Dalvik, máy ảo trên đó Mã Android Java được thực thi trên. Nó đã được cải tiến thường xuyên để kích hoạt mọi dịch vụ Android.


3

Tôi sẽ nói sử dụng java cho ứng dụng chính. Nhưng nếu bạn có một số mã c ++ cần chuyển hoặc một số thư viện bạn cần được triển khai hiệu quả trong c ++, thì hãy sử dụng ndk cho các bit đó


4
Tại sao anh ta nên sử dụng Java sau đó?
Vladislav Rastrusny

3

Tôi không thấy có lý do gì để không sử dụng C ++ để phát triển Android bình thường, Nếu bạn có nhiều kinh nghiệm làm việc trong C ++ và với hệ điều hành phức tạp như windows hoặc bất kỳ thứ gì khác, thì bạn có thể nắm bắt Android một cách nhanh chóng và không phức tạp như hệ điều hành khác được. trong khi học java hoặc làm việc mà không học thì sẽ khó chịu và phức tạp hơn!


3

Cân nhắc quan trọng nhất là mã Java đã biên dịch sẽ chạy trên tất cả các thiết bị Android không thay đổi, trong khi mã gốc sẽ cần được biên dịch cho tất cả các nền tảng đích.

Mục đích chung cho cả Java và Android là bạn viết phần lớn nếu không phải tất cả ứng dụng của bạn bằng Java và chỉ sử dụng những thứ gốc khi không có lựa chọn nào khác ... vì vậy mọi thứ về cách viết ứng dụng sẽ tự nó làm như vậy trong Java.

Bạn sẽ đỡ vất vả hơn trong việc bắc cầu giữa thế giới bản địa và Java bằng cách viết bằng Java.

Ngoài ra, bạn sẽ có lợi lớn nếu bạn chịu khó và học Java. Ứng dụng Android của bạn không chỉ sẽ tốt hơn cho nó, mà bạn sẽ tiếp cận với một cách tiếp cận khác biệt đáng kể đối với OO và bạn sẽ là một lập trình viên tốt hơn cho nó.

Thêm vào đó là thực tế là bạn sẽ vượt qua hàng loạt rủi ro bảo mật bằng cách viết bằng Java.

Theo tôi, đây là một điều không cần phải bàn cãi - hãy sử dụng Java.


2
"... và chỉ sử dụng những thứ bản địa khi không có lựa chọn nào khác". Khi nào không có lựa chọn nào khác? Mọi thứ trên Android đều có thể đạt được thông qua Java!
CinCout
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.