Warum sollte eine Android-App nicht in C / C ++ geschrieben werden, weil Sie „einfach lieber in C / C ++ programmieren“? [geschlossen]

85

Aktualisiert (aus Gründen der Klarheit und zur Verringerung der Mehrdeutigkeit):

Ich werde anfangen, an Android-Apps herumzubasteln. Ich hatte vor, das in C ++ mit dem NDK zu schreiben (da ich mehr Erfahrung in C ++ habe und es Java vorziehe), bin aber auf der Android NDK-Seite auf Folgendes gestoßen :

Sie sollten das NDK nur verwenden, wenn es für Ihre App unerlässlich ist - niemals, weil Sie es einfach vorziehen, in C / C ++ zu programmieren.

Ich hatte den Eindruck, dass Sie die Sprache verwenden sollten, die Sie bevorzugen, solange sie zum Job passt. Könnte jemand erklären, warum es so dringend empfohlen wird, C / C ++ nicht für die Android-Entwicklung zu verwenden?


Original:

Ich werde anfangen, an mobilen Apps herumzubasteln, insbesondere an Android, dem Betriebssystem meines aktuellen Telefons, und ich habe mich gefragt, ob das Schreiben der App in C ++ (oder zumindest des Kerns, dann das Umschließen in Java) eine akzeptable Option ist.

Einige Hintergrundinformationen: Ich bin ein Informatik-Major, der 3 C ++ - Kurse (Intro, Intermediate, OOP und im Frühjahr einen STL-Kurs belegt) und nur 1 Java-Kurs (Intermediate) belegt hat. Aus diesem Grund bin ich mit C ++ besser vertraut und ziehe es Java vor. Auf der Android NDK-Seite bin ich auf Folgendes gestoßen :

Die Verwendung von nativem Code unter Android führt im Allgemeinen nicht zu einer spürbaren Leistungsverbesserung, erhöht jedoch immer die Komplexität Ihrer App. Im Allgemeinen sollten Sie das NDK nur verwenden, wenn es für Ihre App wesentlich ist - niemals, weil Sie es einfach vorziehen, in C / C ++ zu programmieren.

  • Ich hatte den Eindruck, dass Sie die Sprache verwenden sollten, die zum Job passt, sowie eine, mit der Sie vertraut sind
  • Möglicherweise möchte ich die Anwendung auf eine andere mobile Plattform wie iOS portieren, die C ++, aber nicht Java unterstützt
  • Während Java eine Hochsprache ist und daher die Entwicklung beschleunigen sollte, würde die Entwicklung meiner Meinung nach langsamer sein, da ich fast alles neu lernen müsste (da ich nur eine Klasse in der Sprache belegt habe).

Jeder Rat wäre sehr dankbar.

ps: Viele der Antworten zu diesem Thema stammen aus früheren Jahren, und es gibt nur sehr wenige Folgeantworten, in denen das NDK erwähnt wird, das die Entwicklung vollständiger nativer Apps auf Android 2.3 und neuer ermöglicht.

Logan Besecker
quelle
1
"Akzeptabel" ist ein seltsames Wort - es ist sicherlich möglich , über die NDK ...
ildjarn
1
Sie sind wahrscheinlich besser dran, die Kugel zu beißen und Java zu lernen. Das Android-Toolkit soll wirklich von Java aus verwendet werden, und die Zeit, die Sie sparen würden, wenn Sie bereits C ++ kennen, würde aufgewendet werden, und dann würden einige versuchen, herauszufinden, wie alle Android-Inhalte von C ++ aus funktionieren. Betrachten Sie dies als eine Lernmöglichkeit :)
Jeremy Friesner
Persönlich würde ich die Kugel beißen, wie Jeremy sagte, und einfach lernen, was Sie mit Java zu tun haben. Es sollte eigentlich nicht sein , dass große Sache für Sie es relativ schnell zu erlernen.
OmniOwl
Für Ihren ersten Punkt passt C ++ nicht so gut zum Job (Entwicklung für Android) wie Java, unabhängig von der Vertrautheit. Für Ihren zweiten Punkt gibt es, obwohl Android Linux ist, einen großen Unterschied zwischen Android- und Desktop-Apps. Die Lebenszyklen sind unterschiedlich und Sie müssen sich mit Aktivitäten anstatt mit Prozessen befassen. Dies ist eine völlig andere Art der Entwicklung als bei der normalen Desktop-Entwicklung. Für Ihren dritten Punkt dauert das Erlernen des Android SDK in C ++ erheblich länger als das Erlernen des Java SDK in Java (nach dem Erlernen von Java) und dann das Wechseln zu C ++.
Cornstalks
1
Zu viele Leute verwenden den Begriff "C / C ++", als ob es eine einzige Sprache mit diesem Namen gäbe. Ich hoffe, Sie wissen, dass C und C ++ zwei verschiedene (wenn auch eng verwandte) Sprachen sind - und es scheint C ++ zu sein, nicht C, nach dem Sie fragen.
Keith Thompson

Antworten:

106

Denk darüber so. Mit dem Java SDK können Sie eine voll funktionsfähige Anwendung erstellen, die 100% der APIs nutzt, die Entwicklern zur Verfügung stehen. Mit dem NDK können Sie nichts tun, was mit dem SDK nicht möglich ist (aus API-Sicht). Das NDK bietet lediglich eine höhere Leistung.

Schauen Sie es sich jetzt umgekehrt an. Wenn Sie eine Anwendung zu 100% in das NDK schreiben, können Sie weiterhin eine voll funktionsfähige Anwendung schreiben, aber die Anzahl der Framework-APIs, auf die Sie zugreifen können, ist begrenzt. Auf das gesamte Android-Framework kann nicht auf der nativen Ebene zugegriffen werden. Die meisten APIs sind nur Java. Das heißt nicht, dass alle APIs, die SIE möglicherweise benötigen, nicht im NDK verfügbar sind, aber bei weitem nicht ALLE APIs verfügbar sind.

Darüber hinaus führt das NDK plattformspezifischen Code ein, der die Größe Ihrer Distribution erweitert. Für jede Gerätearchitektur, die Sie unterstützen möchten, muss Ihr nativer Code in .so-Dateien (eine für armv5, armv7 und x86) integriert sein, die alle in derselben APK zusammengefasst sind. Durch diese Vervielfältigung von ausführbarem Code wird Ihre App dreimal so groß (dh eine "fette Binärdatei"), es sei denn, Sie übernehmen die Aufgabe, beim Verteilen der Anwendung separate APKs für jede Architektur zu erstellen. Der Bereitstellungsprozess wird also etwas aufwändiger, wenn Sie nicht möchten, dass Ihre APK erheblich an Größe zunimmt.

Auch wenn nichts davon Ihnen verbietet, das zu tun, was Sie wählen, wird darauf hingewiesen, warum Google Java als die "bevorzugte" Methode für den Großteil Ihres Codes und den Weg des geringsten Widerstands beschreibt. Ich hoffe, es gibt Aufschluss darüber, warum die Dokumentation so formuliert ist, wie sie ist.

Devunwired
quelle
1
Vielen Dank! Der Perspektivwechsel war der große Teil, den ich vermisste. Mir war nicht bewusst, dass dem NDK eine API fehlte. Ich habe auch nicht über die Größe der Verteilung nachgedacht; Aber jetzt, wo Sie sich daran erinnert haben, ist es sehr sinnvoll (insbesondere, weil c ++ alle Standardbibliotheken enthalten muss, während die Standardbibliotheken von Java bereits auf den Geräten aktiviert sind). Könnten Sie etwas über die .soDateien erklären ? Mir ist bekannt, dass für jede unterstützte Hardwarearchitektur eine separate Kompilierung von nativem Code erforderlich ist, damit jede .soDatei separat kompiliert wird.
Logan Besecker
42
Die Einschränkung des NDK ist eigentlich schade. Ich würde gerne Hochleistungscode für mobile Plattformen schreiben, hauptsächlich aus Gründen der Akkulaufzeit. Native Angelegenheiten auf mobilen Plattformen. Warum nicht besser unterstützen? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph
2
@LoganBesecker Die NDK-Toolchain kompiliert Ihren Code in eine .sofür jede Architektur, die Sie unterstützen möchten (dies wird von Ihren Makefiles gesteuert), und alle Dateien werden im libs / -Verzeichnis Ihres APK abgelegt. Wenn die APK installiert ist, wird nur die entsprechende .soausgewählt, aber alle müssen noch in der ursprünglichen APK leben.
Devunwired
1
@KonradRudolph Sie können Teile Ihrer Apps mit dem ndk schreiben, Google tut dies für leistungskritische Teile von Android. Mit Ausnahme sehr spezifischer Fälle spielt C ++ vs Java in der Android-Entwicklung keine Rolle, insbesondere jetzt, wo ART kommt. Bei der richtigen Verwendung der APIs, insbesondere derjenigen, die Batterie verbrauchen (GPS, Netzwerk), müssen Sie vorsichtig sein.
Teovald
1
Java ist langsamer. Die JVM muss geladen werden, außerdem ist der Bytecode SEHR effizient, aber nicht "nativ" und hat daher eine kleine Strafe - je nach Anwendung kann dies auffallen. Warum haben sie sich für Java entschieden, insbesondere weil es in einem Interpreter ausgeführt wird: Der Garbage Collector reduziert Speicherprobleme und reduziert app-übergreifende Auswirkungen. Darüber hinaus entfernt die Java-Sprache (obwohl ausführlich) viele der vom Entwickler eingeführten Fehler von C ++.
Daniel
25

Wenn Sie nur eine App in Ihrem Leben entwickeln möchten, verwenden Sie das NDK.

Wenn Sie die Android-Entwicklung mit der Absicht erlernen möchten, mehr als eine Anwendung während Ihres Lebens zu entwickeln - und sie alle ordnungsgemäß unterstützen möchten -, werden Sie auf lange Sicht sehr wahrscheinlich bessere Ergebnisse erzielen, wenn Sie Java und lernen Verwenden Sie stattdessen das Java SDK von Android.

Isaac
quelle
Diese Logik ist sehr praktisch.
Vvnraman
8

Die Programmierer bei King verwenden C ++ für ihre Spielelogik. Und nach ihrem Umsatz scheinen sie gut abzuschneiden.

Nach meiner Erfahrung ist C ++ für Problemlöser und Java für Problemvermeider. Ich liebe beide Sprachen, aber C ++ ist sehr lohnend, wenn Sie guten Code schreiben. Es kann jedoch nur einige Momente dauern, bis die Zauberei da ist.

Sie können C ++ auch für Datenwissenschaftler empfehlen, die ihre Arbeit normalerweise beispielsweise von Python oder R erledigen lassen. C ++ kann das Gleiche mit einer guten oder nicht besseren Leistung tun, aber es braucht nur ein Genie in der Sprache. Deshalb würde ich nie nicht C ++ empfehlen der, die es tun will - ich würde nur ein Heads - up auf die Behandlung geben , dass sie in für.

JAkerblom
quelle
1
Jedes Mal, wenn Sie Probleme lösen, die nur in C ++ auftreten, können Sie die eigentliche Funktionalität Ihrer App aufbauen.
user45623
4

Ich fand diesen interessanten Artikel von: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ wurde speziell für die Plattformunabhängigkeit entwickelt und ist als solches auf jedem einzelnen Betriebssystem vorhanden. Ein typischer mobiler Benutzer weiß möglicherweise, dass Android-Apps in Objective-C Java- und iOS-Apps sind. Viele wissen jedoch nicht, dass sich auf Ihren Geräten mehr C / C ++ - Code im Speicher befindet als alles andere. C / C ++ steuert einen Großteil der Technologie kleiner Geräte (wie des Kernels, der mit der Hardware interagiert, sowie typischer Laufzeitbibliotheken) und der Telekommunikationsnetzwerke, die diese Geräte ermöglichen. Wichtiger für ein Entwicklungsteam ist, dass es C / C ++ - Schnittstellen und -Bibliotheken für alles gibt, was Sie auf jedem Gerät und jeder Plattform tun müssen. Das Android NDK-Toolset ist ein hervorragendes Beispiel für die vollständige C / C ++ - Unterstützung, die ursprünglich für Spieleentwicklungsteams hinzugefügt wurde, um die bestmögliche Leistung des Geräts zu erzielen, indem Java und die Android Java-Laufzeit Dalvik, auf der die virtuelle Maschine verwendet wird, vermieden werden Android Java Code wird am ausgeführt. Es wurde regelmäßig verbessert, um jeden Android-Dienst zu aktivieren.

Moussa D.
quelle
3

Ich würde sagen, verwenden Sie Java für die Haupt-App. Wenn Sie jedoch C ++ - Code haben, den Sie portieren müssen, oder eine Bibliothek, die Sie benötigen und die effizient in C ++ implementiert ist, verwenden Sie ndk für diese Bits

Dan
quelle
4
Warum sollte er dann Java benutzen?
Vladislav Rastrusny
3

Ich sehe keinen Grund, C ++ nicht für die normale Android-Entwicklung zu verwenden. Wenn Sie umfangreiche Erfahrung in der Arbeit mit C ++ und mit komplexen Betriebssystemen wie Windows oder einem anderen haben, können Sie Android schnell verstehen und sind nicht so kompliziert wie das andere Betriebssysteme sind. Während Sie Java lernen oder ohne zu lernen arbeiten, wäre es frustrierender und komplexer!

stng
quelle
3

Die wichtigste Überlegung ist, dass der kompilierte Java-Code auf allen Android-Geräten unverändert ausgeführt wird, während der native Code für alle Zielplattformen kompiliert werden muss.

Die allgemeine Absicht für Java und Android ist, dass Sie die Mehrheit, wenn nicht die gesamte App in Java schreiben und native Dinge nur verwenden, wenn es keine andere Option gibt. Alles, was mit dem Schreiben der App zu tun hat, eignet sich daher für Java.

Wenn Sie in Java schreiben, ersparen Sie sich viel Ärger bei der Überbrückung der nativen und der Java-Welt.

Sie werden sich auch einen großen Gefallen tun, wenn Sie den Sprung wagen und Java lernen. Ihre Android-App ist nicht nur die bessere für Sie, sondern Sie werden sich auch einem deutlich anderen Ansatz für OO aussetzen und ein besserer Programmierer dafür sein.

Hinzu kommt, dass Sie eine ganze Reihe von Sicherheitsrisiken umgehen, indem Sie in Java schreiben.

In meinen Augen ist dies ein Kinderspiel - verwenden Sie Java.

Lawrence Dol
quelle
2
"... und native Dinge nur verwenden, wenn es keine andere Option gibt". Wann kann es keine andere Option geben? Alles auf Android kann über Java erreicht werden!
CinCout