Perché un'app Android non dovrebbe essere scritta in C / C ++ perché "preferisci semplicemente programmare in C / C ++"? [chiuso]


86

Aggiornato (per chiarezza e per ridurre l'ambiguità):

Inizierò ad armeggiare con le app Android. Avevo intenzione di scrivere in C ++ usando NDK (dato che ho più esperienza in C ++ e lo preferisco a Java) ma ho trovato quanto segue sulla pagina Android NDK :

dovresti usare NDK solo se è essenziale per la tua app, mai perché preferisci semplicemente programmare in C / C ++.

Ho avuto l'impressione che dovresti usare la lingua che preferisci, purché si adatti al lavoro. Qualcuno potrebbe spiegare perché è così fortemente consigliato di non usare C / C ++ per lo sviluppo Android?


Originale:

Inizierò ad armeggiare con le app mobili, in particolare Android, che è il sistema operativo del mio telefono attuale, e mi chiedevo se scrivere l'app in C ++ (o almeno il core, quindi avvolgere in Java) fosse un'opzione accettabile.

Qualche background, sono un laureato in informatica che ha seguito 3 corsi C ++ (intro, intermedio, OOP e sto frequentando un corso STL in primavera) e solo 1 corso Java (intermedio). Per questo motivo, sono più a mio agio con C ++ e lo preferisco a Java. Mi sono imbattuto in quanto segue nella pagina Android NDK :

L'utilizzo del codice nativo su Android in genere non comporta un notevole miglioramento delle prestazioni, ma aumenta sempre la complessità dell'app. In generale, dovresti usare NDK solo se è essenziale per la tua app, mai perché preferisci semplicemente programmare in C / C ++.

  • Avevo l'impressione che dovessi usare il linguaggio più adatto al lavoro e quello che conosci
  • Potrei voler portare l'applicazione su un'altra piattaforma mobile, come iOS, che supporta C ++ ma non java
  • Sebbene Java sia un linguaggio di alto livello e quindi dovrebbe rendere lo sviluppo più veloce, sento che lo sviluppo sarebbe più lento perché dovrei imparare di nuovo quasi tutto (dato che ho seguito solo una lezione sulla lingua)

Qualsiasi consiglio sarebbe molto apprezzato.

ps: molte delle risposte su questo argomento sono di anni fa e ci sono pochissime risposte successive che menzionano l'NDK che consente lo sviluppo di app native complete su Android 2.3 e versioni successive.


1
"Accettabile" è una parola strana - è certamente possibile , tramite NDK ...
ildjarn

1
Probabilmente faresti meglio a mordere i proiettili e imparare Java. Il toolkit Android è davvero progettato per essere utilizzato da Java, e il tempo che risparmieresti sapendo già C ++ verrebbe speso e poi un po 'cercando di capire come far funzionare tutto il materiale Android da C ++. Pensa a questa come un'opportunità di apprendimento :)
Jeremy Friesner

Personalmente morderei i denti come ha detto Jeremy e imparerei semplicemente cosa devi fare con Java. E 'in realtà non dovrebbe essere che affare grande un per imparare è relativamente veloce.
OmniOwl

Per il tuo primo punto, C ++ non si adatta al lavoro (sviluppo per Android) così come fa Java, indipendentemente dalla familiarità. Per il tuo secondo punto, nonostante Android sia Linux, c'è un'enorme differenza tra Android e app desktop; i cicli di vita sono diversi e devi affrontare le attività anziché i processi, che è un modo di sviluppo completamente diverso rispetto al normale sviluppo desktop. Per il terzo punto, l'apprendimento di Android SDK in C ++ richiederà molto più tempo di quanto sarà necessario per impararlo prima in Java (dopo aver appreso Java), quindi passare a C ++.
Steli di mais

1
Troppe persone usano il termine "C / C ++" come se ci fosse un'unica lingua con quel nome. Spero che tu sappia che C e C ++ sono due linguaggi diversi (sebbene strettamente correlati) e sembra che tu stia chiedendo C ++, non C.
Keith Thompson

Risposte:


107

Pensare in questo modo. Hai la possibilità di utilizzare Java SDK per creare un'applicazione completamente funzionante che sfrutta il 100% delle API disponibili per gli sviluppatori. Non c'è niente che puoi fare con l'NDK che non possa essere fatto con l'SDK (dal punto di vista dell'API), l'NDK fornisce solo prestazioni più elevate.

Ora guardalo al contrario. Se scegli di scrivere un'applicazione al 100% nell'NDK, puoi comunque scrivere un'applicazione completamente funzionante, ma sei limitato nel numero di API del framework a cui puoi accedere. Non è possibile accedere a tutto il framework Android a livello nativo; la maggior parte delle API sono solo Java. Questo non vuol dire che tutte le API SI necessari non sono disponibili nel NDK, ma in nessun posto vicino TUTTE le API sono esposti.

Oltre a questo, l'NDK introduce codice specifico della piattaforma che espande le dimensioni della distribuzione. Per ogni architettura del dispositivo che intendi supportare, il tuo codice nativo deve essere integrato in file .so (uno per armv5, armv7 e x86), tutti impacchettati nello stesso APK. Questa duplicazione del codice eseguibile rende la tua app 3 volte la dimensione (cioè un "fat binary") a meno che tu non ti assuma il compito di creare APK separati per ciascuna architettura quando distribuisci l'applicazione. Quindi il processo di distribuzione diventa un po 'più laborioso se non vuoi che le dimensioni dell'APK aumentino in modo significativo.

Anche in questo caso, anche se niente di tutto ciò ti impedisce di fare ciò che scegli, sottolinea perché Google descrive Java come il metodo "preferito" per la maggior parte del tuo codice e il percorso di minor resistenza. Spero che faccia luce sul motivo per cui la documentazione è formulata in questo modo.


1
Grazie mille! Il cambio di prospettiva era la parte importante che mi mancava. Non sapevo che l'NDK mancasse di alcune API. Inoltre non stavo pensando alla dimensione della distribuzione; ma ha molto senso ora che lo hai ricordato (in particolare perché c ++ deve includere tutte le librerie standard mentre le librerie standard di java sono già attive sui dispositivi). Potresti spiegare un po 'dei .sofile? Sono consapevole che deve esserci una compilazione separata di codice nativo per ogni architettura hardware supportata, quindi ogni .sofile ha una compilazione separata?
Logan Besecker

43
La restrizione dell'NDK è in realtà un peccato. Mi piacerebbe scrivere codice ad alte prestazioni per piattaforme mobili, principalmente per considerazioni sulla durata della batteria. Le questioni native sulle piattaforme mobili. Perché non supportarlo meglio? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph

2
@LoganBesecker La toolchain NDK eseguirà la compilazione incrociata del codice in una .soper ciascuna architettura che hai scelto di supportare (questa è controllata dai tuoi makefile) e tutti i file verranno inseriti nella directory libs / del tuo APK. Quando l'APK è installato, .soverrà selezionato solo quello appropriato , ma devono comunque risiedere tutti nell'APK iniziale.
devunwired

1
@KonradRudolph puoi scrivere parti delle tue app con ndk, Google lo fa per le parti critiche per le prestazioni di Android. Ad eccezione di casi molto specifici, c ++ vs java è irrilevante nello sviluppo di Android, specialmente ora che ART sta arrivando. Il giusto utilizzo delle API, soprattutto quelle che consumano batteria (GPS, rete) è dove bisogna stare attenti.
Teovald

1
Java è più lento. La JVM deve essere caricata, inoltre il byte-code è MOLTO efficiente, ma non è "nativo" e quindi ha una piccola penalità - a seconda dell'applicazione questo può essere evidente. Per quanto riguarda il motivo per cui hanno scelto Java, in particolare perché viene eseguito in un interprete: il garbage collector riduce i problemi di memoria e riduce gli impatti tra le app. Inoltre, il linguaggio Java (sebbene dettagliato) rimuove molti degli errori introdotti dagli sviluppatori di C ++.
Daniel

25

Se hai intenzione di sviluppare solo un'app nella tua vita, usa NDK.

Se stai mirando ad apprendere lo sviluppo di Android con l'intenzione di sviluppare più di un'applicazione durante la tua vita e vuoi essere in grado di supportarle correttamente tutte, è molto probabile che tu faccia meglio a lungo termine se impari Java e usa invece l'SDK Java di Android.


Questa logica ha molto senso pratico.
vvnraman

8

I programmatori di King usano C ++ per la loro logica di gioco. E sembra che stiano andando bene a giudicare dal loro fatturato.

Nella mia esperienza, C ++ è per i risolutori di problemi e Java è per chi evita i problemi. Adoro entrambe le lingue, ma il C ++ è abbastanza gratificante quando scrivi un buon codice. Tuttavia, potrebbero essere necessari solo diversi momenti di magia per arrivarci.

Potresti raccomandare C ++ anche per i data scientist, che normalmente svolgerebbero il loro lavoro, ad esempio, Python o R. C ++ può fare lo stesso con prestazioni altrettanto buone o meno, ma ci vuole solo essere un genio nella lingua. Questo è il motivo per cui non consiglierei mai C ++ a chi lo desidera: darei solo un avvertimento al trattamento per cui si trovano.


2
Ogni volta che dedichi alla risoluzione di problemi esclusivi di C ++ è tempo che avresti potuto dedicare alla creazione delle funzionalità effettive della tua app.
user45623

4

Ho trovato questo articolo interessante da: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ è stato creato appositamente per l'indipendenza dalla piattaforma e come tale si trova su ogni singolo sistema operativo esistente. Il tuo tipico utente mobile potrebbe sapere che le app Android sono scritte app Java e iOS in Objective-C, ma quello che molti non sanno è che c'è più codice C / C ++ in memoria sui tuoi dispositivi che altro. C / C ++ guida gran parte della tecnologia dei piccoli dispositivi (come il kernel, che interagisce con l'hardware, oltre alle tipiche librerie di runtime) e delle reti di telecomunicazioni che abilitano questi dispositivi. Ancora più importante per un team di sviluppo, è che ci sono interfacce e librerie C / C ++ per tutto ciò che devi fare su qualsiasi dispositivo e piattaforma. Il set di strumenti Android NDK è un ottimo esempio del supporto completo C / C ++ che è stato aggiunto originariamente per i team di sviluppo di giochi per consentire loro di ottenere le migliori prestazioni possibili dal dispositivo evitando Java e il runtime Java Android Dalvik, la macchina virtuale su cui Il codice Java Android viene eseguito su. È stato regolarmente migliorato per abilitare tutti i servizi Android.


3

Direi che usa java per l'app principale. Ma se hai del codice c ++ che devi portare o una libreria che ti serve che sia implementata in modo efficiente in c ++, usa ndk per quei bit


4
Perché dovrebbe usare Java allora?
Vladislav Rastrusny

3

Non vedo alcun motivo per non utilizzare C ++ per il normale sviluppo Android, se hai una vasta esperienza nel lavorare in C ++ e con sistemi operativi complessi come Windows o altri simili, puoi afferrare Android rapidamente e non è tanto complicato quanto il altri sistemi operativi sono. mentre si impara Java o si lavora senza imparare sarebbe più frustrante e complesso!


3

La considerazione più importante è che il codice Java compilato verrà eseguito su tutti i dispositivi Android senza modifiche, mentre il codice nativo dovrà essere compilato per tutte le piattaforme di destinazione.

L'intento generale sia per Java che per Android è che scrivi la maggior parte se non tutta la tua app in Java e usi cose native solo quando non c'è altra opzione ... quindi tutto ciò che riguarda la scrittura dell'app si presterà a farlo in Java.

Ti risparmierai un sacco di seccature nel collegare i mondi nativi e Java scrivendo in Java.

Inoltre, ti farai un grande favore se fai il grande passo e impari Java. Non solo la tua app Android sarà migliore per questo, ma ti esporrai a un approccio significativamente diverso all'OO e sarai un programmatore migliore per questo.

Aggiungete a ciò il fatto che eviterete un sacco di rischi per la sicurezza scrivendo in Java.

Nella mia mente, questo è un gioco da ragazzi: usa Java.


2
"... e usa cose native solo quando non ci sono altre opzioni". Quando non ci possono essere altre opzioni? Tutto su Android può essere ottenuto tramite Java!
CinCout
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.