Dlaczego aplikacja na Androida nie powinna być napisana w języku C / C ++, ponieważ „po prostu wolisz programować w języku C / C ++”? [Zamknięte]


86

Zaktualizowano (dla jasności i dla zmniejszenia niejednoznaczności):

Zacznę majstrować przy aplikacjach na Androida. Planowałem napisać w C ++ przy użyciu NDK (ponieważ mam większe doświadczenie w C ++ i wolę to od Java), ale na stronie Android NDK natknąłem się na następujące rzeczy :

powinieneś używać NDK tylko wtedy, gdy jest niezbędny dla twojej aplikacji - nigdy dlatego, że po prostu wolisz programować w C / C ++.

Odniosłem wrażenie, że powinieneś używać preferowanego języka, o ile pasuje do pracy. Czy ktoś mógłby wyjaśnić, dlaczego tak mocno odradza się używanie C / C ++ do tworzenia aplikacji na Androida?


Oryginał:

Zacznę majstrować przy aplikacjach mobilnych, w szczególności Androidzie, który jest systemem operacyjnym mojego obecnego telefonu, i zastanawiałem się, czy pisanie aplikacji w C ++ (lub przynajmniej rdzeniu, a następnie zawijanie w Javie) było akceptowalną opcją.

Mam pewne doświadczenie, jestem informatykiem, który ukończył 3 kursy C ++ (wprowadzenie, średniozaawansowany, OOP, a wiosną biorę kurs STL) i tylko 1 kurs Java (średniozaawansowany). Z tego powodu wolę C ++ i wolę go od Javy. Na stronie Android NDK natknąłem się na :

Korzystanie z kodu natywnego w systemie Android na ogół nie powoduje zauważalnej poprawy wydajności, ale zawsze zwiększa złożoność aplikacji. Ogólnie rzecz biorąc, powinieneś używać NDK tylko wtedy, gdy jest niezbędny dla twojej aplikacji - nigdy dlatego, że po prostu wolisz programować w C / C ++.

  • Odniosłem wrażenie, że powinieneś używać języka odpowiedniego do pracy, a także takiego, który znasz
  • Mogę chcieć przenieść aplikację na inną platformę mobilną, taką jak iOS, która obsługuje C ++, ale nie java
  • Chociaż Java jest językiem wysokiego poziomu i dlatego powinien przyspieszyć rozwój, czuję, że rozwój byłby wolniejszy, ponieważ musiałbym nauczyć się od nowa prawie wszystkiego (ponieważ miałem tylko jedną lekcję z tego języka)

Każda rada byłaby bardzo wdzięczna.

ps: wiele odpowiedzi na ten temat pochodzi z lat temu, a niewiele jest odpowiedzi, które wspominają o NDK umożliwiającym tworzenie pełnych natywnych aplikacji na Androida 2.3 i nowszych.


1
„Akceptowalne” to dziwne słowo - z pewnością możliwe , przez NDK ...
ildjarn,

1
Prawdopodobnie lepiej ugryźć się i uczyć Java. Zestaw narzędzi dla Androida jest naprawdę przeznaczony do użytku z Javą, a czas, który zaoszczędziłbyś na znajomości C ++, zostałby spędzony, a następnie niektórzy próbowaliby dowiedzieć się, jak sprawić, by wszystkie rzeczy na Androida działały z C ++. Potraktuj to jako okazję do nauki :)
Jeremy Friesner

Osobiście ugryzłbym kulkę, jak powiedział Jeremy, i po prostu dowiedziałbym się, co musisz zrobić z Javą. Właściwie nie powinno być dla ciebie aż tak wielkiego problemu, jeśli nauczysz się go stosunkowo szybko.
OmniOwl,

Po pierwsze, C ++ nie pasuje do tego zadania (programowanie dla Androida) prawie tak dobrze jak Java, niezależnie od znajomości. Po drugie, mimo że Android to Linux, istnieje ogromna różnica między aplikacjami na Androida i komputery stacjonarne; cykle życia są różne i musisz zajmować się działaniami zamiast procesami, co jest zupełnie innym sposobem programowania w porównaniu z normalnym programowaniem pulpitu. Po trzecie, nauka Android SDK w C ++ zajmie Ci znacznie więcej czasu, niż nauka najpierw w Javie (po nauczeniu się Javy), a potem przejście na C ++.
Cornstalks

1
Zbyt wiele osób używa terminu „C / C ++” tak, jakby istniał tylko jeden język o tej nazwie. Mam nadzieję, że wiesz, że C i C ++ to dwa różne (choć blisko spokrewnione) języki - i wydaje się, że pytasz o C ++, a nie C.
Keith Thompson

Odpowiedzi:


107

Pomyśl o tym w ten sposób. Masz możliwość wykorzystania Java SDK do zbudowania w pełni działającej aplikacji, która w 100% wykorzystuje API dostępne dla programistów. Nie ma nic, co można zrobić z NDK, czego nie można zrobić za pomocą SDK (z perspektywy API), NDK zapewnia po prostu wyższą wydajność.

Teraz spójrz na to w odwrotnej kolejności. Jeśli zdecydujesz się napisać aplikację w 100% w NDK, nadal możesz napisać w pełni funkcjonalną aplikację, ale masz ograniczoną liczbę interfejsów API platformy, do których masz dostęp. Nie do wszystkich struktur systemu Android można uzyskać dostęp w warstwie natywnej; większość interfejsów API to tylko Java. To nie znaczy, że wszystkie interfejsy API TY mogą potrzebować nie są dostępne w NDK, ale nigdzie w pobliżu ALL API są narażone.

Poza tym NDK wprowadza kod specyficzny dla platformy, który rozszerza rozmiar Twojej dystrybucji. Dla każdej architektury urządzenia, którą chcesz obsługiwać, Twój natywny kod musi być wbudowany w pliki .so (jeden dla armv5, armv7 i x86), wszystkie spakowane w tym samym APK. To zduplikowanie kodu wykonywalnego sprawia, że ​​Twoja aplikacja jest trzykrotnie większa (tj. „Gruby plik binarny”), chyba że podczas dystrybucji aplikacji podejmiesz zadanie tworzenia oddzielnych plików APK dla każdej architektury. Proces wdrażania staje się więc nieco bardziej skomplikowany, jeśli nie chcesz, aby plik APK znacznie się powiększył.

I znowu, chociaż żadna z tych rzeczy nie zabrania ci robienia tego, co wybierzesz, wskazuje, dlaczego Google określa Javę jako metodę „preferowaną” dla większości twojego kodu i jako ścieżkę najmniejszego oporu. Mam nadzieję, że to rzuci trochę światła na to, dlaczego dokumentacja jest sformułowana tak, jak jest.


1
Dziękuję Ci bardzo! Zmiana perspektywy była największą częścią, której mi brakowało. Nie wiedziałem, że w NDK brakuje jakiegoś API. Nie myślałem też o wielkości dystrybucji; ale teraz, gdy przypomniałeś sobie o tym, ma to dużo sensu (szczególnie dlatego, że c ++ musi zawierać wszystkie standardowe biblioteki, podczas gdy standardowe biblioteki Java są już włączone na urządzeniach). Czy mógłbyś wyjaśnić trochę o .soplikach? Zdaję sobie sprawę, że musi istnieć osobna kompilacja kodu natywnego dla każdej obsługiwanej architektury sprzętowej, więc każdy .soplik ma osobną kompilację?
Logan Besecker

43
Ograniczenie NDK to właściwie szkoda. Chciałbym napisać kod o wysokiej wydajności na platformy mobilne, głównie ze względu na żywotność baterii. Natywne sprawy na platformach mobilnych. Dlaczego nie wesprzeć go lepiej? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph

2
@LoganBesecker Łańcuch narzędzi NDK skompiluje krzyżowo twój kod do .sokażdej architektury, którą wybrałeś do obsługi (jest to kontrolowane przez twoje pliki makefiles), a wszystkie pliki zostaną umieszczone w katalogu libs / twojego APK. Po zainstalowaniu APK .sozostaną wybrane tylko odpowiednie , ale wszystkie one nadal muszą znajdować się w początkowym APK.
devunwired

1
@KonradRudolph możesz pisać części swoich aplikacji za pomocą ndk, Google robi to dla krytycznych dla wydajności części Androida. Z wyjątkiem bardzo specyficznych przypadków, c ++ vs java nie ma znaczenia w programowaniu na Androida, zwłaszcza teraz, gdy nadchodzi ART. Należy zachować ostrożność przy prawidłowym korzystaniu z interfejsów API, zwłaszcza tych, które zużywają baterię (GPS, sieć).
Teovald

1
Java jest wolniejsza. JVM musi się załadować, a kod bajtowy jest BARDZO wydajny, ale nie jest „natywny”, a zatem ma niewielką karę - w zależności od aplikacji może to być zauważalne. Co do tego, dlaczego wybrali Javę, zwłaszcza dlatego, że działa ona w interprecie: moduł odśmiecania pamięci zmniejsza problemy z pamięcią i ogranicza wpływ aplikacji na różne aplikacje. Dodatkowo język Java (choć gadatliwy) usuwa wiele błędów wprowadzonych przez programistę w C ++.
Daniel

25

Jeśli zamierzasz w życiu stworzyć tylko jedną aplikację, skorzystaj z NDK.

Jeśli zamierzasz uczyć się programowania na Androida z zamiarem tworzenia więcej niż jednej aplikacji w ciągu swojego życia - i chcesz móc odpowiednio je wszystkie obsługiwać - na dłuższą metę prawdopodobnie osiągniesz lepsze wyniki, jeśli nauczysz się języka Java i zamiast tego użyj Java SDK systemu Android.


Ta logika ma wiele praktycznego sensu.
vvnraman

8

Programiści w King używają C ++ do swojej logiki gry. I wydaje się, że dobrze sobie radzą, sądząc po ich obrotach.

Z mojego doświadczenia wynika, że ​​C ++ jest dla osób rozwiązujących problemy, a Java jest dla osób unikających problemów. Uwielbiam oba języki, ale C ++ daje wiele satysfakcji, gdy piszesz dobry kod. Jednak dotarcie tam może zająć kilka chwil magii.

Możesz polecić C ++ również naukowcom zajmującym się danymi, którzy normalnie wykonaliby swoją pracę, powiedzmy, Python lub R. C ++ może zrobić to samo z równie dobrą lub nie lepszą wydajnością, ale wystarczy być geniuszem w języku. Dlatego nigdy nie polecałbym C ++ komuś, kto chce to zrobić - po prostu dałbym głowę do uczty, na którą są przygotowani.


1
Każdy czas spędzony na rozwiązywaniu problemów występujących wyłącznie w C ++ to czas, który mógłbyś poświęcić na tworzenie faktycznej funkcjonalności aplikacji.
user45623

4

Znalazłem ten interesujący artykuł z: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ został stworzony specjalnie z myślą o niezależności platformy i jako taki można go znaleźć w każdym istniejącym systemie operacyjnym. Twój typowy użytkownik mobilny może wiedzieć, że aplikacje na Androida są napisane w języku Java i iOS w Objective-C, ale wielu nie wie, że na urządzeniach jest więcej kodu C / C ++ niż cokolwiek innego. C / C ++ napędza wiele technologii małych urządzeń (takich jak jądro, które współdziała ze sprzętem, a także typowymi bibliotekami uruchomieniowymi) i sieciami telekomunikacyjnymi, które obsługują te urządzenia. Ważniejsze dla zespołu programistów jest to, że istnieją interfejsy C / C ++ i biblioteki do wszystkiego, co musisz zrobić na dowolnym urządzeniu i platformie. Zestaw narzędzi Android NDK jest doskonałym przykładem pełnej obsługi C / C ++, która została pierwotnie dodana do zespołów tworzących gry, aby umożliwić im uzyskanie najlepszej możliwej wydajności z urządzenia poprzez unikanie Java i środowiska uruchomieniowego Java dla Androida Dalvik, maszyny wirtualnej, na której Kod Java dla Androida jest wykonywany na. Jest regularnie ulepszany, aby umożliwić obsługę każdej usługi systemu Android.


3

Powiedziałbym, że użyj javy dla głównej aplikacji. Ale jeśli masz kod w C ++, który chcesz przenieść lub bibliotekę, której potrzebujesz, która jest wydajnie zaimplementowana w C ++, użyj ndk dla tych bitów


4
Dlaczego miałby więc używać Javy?
Vladislav Rastrusny

3

Nie widzę żadnego powodu, aby nie używać C ++ do normalnego programowania Androida.Jeśli masz duże doświadczenie w pracy w C ++ i ze złożonymi systemami operacyjnymi, takimi jak Windows lub jakikolwiek inny, możesz szybko zrozumieć Androida i nie jest to tak skomplikowane, jak inne systemy operacyjne są. podczas nauki języka Java lub pracy bez nauki byłoby to bardziej frustrujące i złożone!


3

Najważniejszą kwestią jest to, że skompilowany kod Java będzie działał na wszystkich urządzeniach z Androidem bez zmian, podczas gdy kod natywny będzie musiał zostać skompilowany dla wszystkich platform docelowych.

Ogólnym zamiarem zarówno dla Javy, jak i Androida jest to, aby napisać większość, jeśli nie całą aplikację, w Javie i używać natywnych rzeczy tylko wtedy, gdy nie ma innej opcji ... więc wszystko, co dotyczy pisania aplikacji, nadaje się do zrobienia w Javie.

Pisząc w Javie, oszczędzisz sobie wiele irytacji w tworzeniu pomostów między światem natywnym i Java.

Jak dobrze, zrobisz sobie wielką przysługę, jeśli zdecydujesz się na zanurzenie i nauczysz się Java. Nie tylko Twoja aplikacja na Androida będzie lepsza, ale wystawisz się na znacznie inne podejście do OO i będziesz lepszym programistą.

Dodaj do tego fakt, że pisząc w Javie, ominiesz całą masę zagrożeń bezpieczeństwa.

Moim zdaniem jest to oczywiste - użyj Java.


2
„… i używaj natywnych rzeczy tylko wtedy, gdy nie ma innej opcji”. Kiedy nie może być innej opcji? Wszystko na Androidzie można osiągnąć za pomocą Java!
CinCout
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.