¿Por qué una aplicación de Android no debería estar escrita en C / C ++ porque "simplemente prefiere programar en C / C ++"? [cerrado]

86

Actualizado (para mayor claridad y para reducir la ambigüedad):

Voy a empezar a jugar con las aplicaciones de Android. Estaba planeando escribir en C ++ usando el NDK (ya que tengo más experiencia en C ++ y lo prefiero a Java) pero encontré lo siguiente en la página de Android NDK :

solo debe usar el NDK si es esencial para su aplicación, nunca porque simplemente prefiera programar en C / C ++.

Tenía la impresión de que debería utilizar el idioma que prefiera, siempre que se adapte al trabajo. ¿Alguien podría explicar por qué se recomienda tanto no utilizar C / C ++ para el desarrollo de Android?


Original:

Voy a empezar a jugar con las aplicaciones móviles, específicamente Android, que es el sistema operativo de mi teléfono actual, y me preguntaba si escribir la aplicación en C ++ (o al menos el núcleo, luego envolver en Java) era una opción aceptable.

Algunos antecedentes, soy un estudiante de ciencias de la computación que ha tomado 3 cursos de C ++ (introducción, intermedio, OOP, y estoy tomando un curso STL en la primavera) y solo 1 curso de Java (intermedio). Debido a esto, me siento más cómodo con C ++ y lo prefiero a Java. Encontré lo siguiente en la página de Android NDK :

El uso de código nativo en Android generalmente no resulta en una mejora notable del rendimiento, pero siempre aumenta la complejidad de la aplicación. En general, solo debe usar el NDK si es esencial para su aplicación, nunca porque simplemente prefiera programar en C / C ++.

  • Tenía la impresión de que debería utilizar el idioma que mejor se adapte al trabajo, así como uno con el que esté familiarizado.
  • Es posible que desee portar la aplicación a otra plataforma móvil, como iOS, que admita C ++ pero no Java.
  • Si bien Java es un lenguaje de alto nivel y, por lo tanto, debería acelerar el desarrollo, creo que el desarrollo sería más lento porque tendría que volver a aprender casi todo (ya que solo he tomado una clase sobre el lenguaje)

Cualquier consejo sería muy apreciado.

PD: muchas de las respuestas sobre este tema son de hace años y hay muy pocas respuestas de seguimiento que mencionen que el NDK permite el desarrollo de aplicaciones nativas completas en Android 2.3 y versiones posteriores.

Logan Besecker
fuente
1
"Aceptable" es una palabra extraña; ciertamente es posible , a través del NDK ...
ildjarn
1
Probablemente sea mejor morder la bala y aprender Java. El kit de herramientas de Android está realmente diseñado para ser utilizado desde Java, y el tiempo que ahorraría sabiendo que C ++ se gastaría y luego trataría de descubrir cómo hacer que todas las cosas de Android funcionen desde C ++. Piense en esto como una oportunidad de aprendizaje :)
Jeremy Friesner
Personalmente, me mordería la bala como dijo Jeremy y simplemente aprendería lo que tienes que hacer con Java. En realidad, no debería ser tan importante que lo aprendas relativamente rápido.
OmniOwl
Para su primer punto, C ++ no se ajusta al trabajo (desarrollo para Android) tan bien como lo hace Java, independientemente de su familiaridad. Para su segundo punto, a pesar de que Android es Linux, existe una gran diferencia entre las aplicaciones de escritorio y Android; Los ciclos de vida son diferentes y tienes que lidiar con actividades en lugar de procesos, que es una forma de desarrollo completamente diferente en comparación con el desarrollo de escritorio normal. Para su tercer punto, aprender el SDK de Android en C ++ le llevará mucho más tiempo que aprenderlo en Java primero (después de aprender Java) y luego cambiar a C ++.
Cornstalks
1
Demasiadas personas usan el término "C / C ++" como si hubiera un solo idioma con ese nombre. Espero que sepa que C y C ++ son dos lenguajes diferentes (aunque estrechamente relacionados), y parece que es C ++, no C, por lo que está preguntando.
Keith Thompson

Respuestas:

107

Piénsalo de esta manera. Tiene la capacidad de utilizar el SDK de Java para crear una aplicación de trabajo completa que aprovecha el 100% de las API disponibles para los desarrolladores. No hay nada que pueda hacer con el NDK que no se pueda hacer con el SDK (desde una perspectiva de API), el NDK solo proporciona un mayor rendimiento.

Ahora mírelo al revés. Si elige escribir una aplicación al 100% en el NDK, aún puede escribir una aplicación completamente funcional, pero está limitado en la cantidad de API de marco a las que puede acceder. No se puede acceder a todo el marco de Android en la capa nativa; la mayoría de las API son solo Java. Eso no quiere decir que todas las API que USTED pueda necesitar no estén disponibles en el NDK, pero no están expuestas ni cerca de TODAS las API.

Más allá de esto, el NDK introduce un código específico de la plataforma que expande el tamaño de su distribución. Para cada arquitectura de dispositivo que pretenda admitir, su código nativo debe estar integrado en archivos .so (uno para armv5, armv7 y x86) todos empaquetados en el mismo APK. Esta duplicación de código ejecutable hace que su aplicación triplique el tamaño (es decir, un "binario gordo") a menos que asuma la tarea de crear APK separados para cada arquitectura cuando distribuya la aplicación. Por lo tanto, el proceso de implementación se vuelve un poco más complicado si no desea que su APK aumente de tamaño significativamente.

Nuevamente, aunque nada de esto le prohíbe hacer lo que elija, señala por qué Google describe Java como el método "preferido" para la mayoría de su código y el camino de menor resistencia. Espero que arroje algo de luz sobre por qué la documentación está redactada como está.

desconectado
fuente
1
¡Muchas gracias! El cambio de perspectiva era la gran parte que me faltaba. No sabía que el NDK carecía de API. Tampoco estaba pensando en el tamaño de la distribución; pero tiene mucho sentido ahora que lo ha recordado (específicamente porque c ++ debe incluir todas las bibliotecas estándar, mientras que las bibliotecas estándar de Java ya están en los dispositivos). ¿Podría explicarnos un poco sobre los .soarchivos? Soy consciente de que debe haber una compilación separada de código nativo para cada arquitectura de hardware compatible, por lo que cada .soarchivo tiene una compilación separada.
Logan Besecker
43
La restricción del NDK es realmente una lástima. Me encantaría escribir código de alto rendimiento para plataformas móviles, principalmente por consideraciones de duración de la batería. Asuntos nativos en plataformas móviles. ¿Por qué no apoyarlo mejor? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph
2
@LoganBesecker La cadena de herramientas del NDK compilará su código en una .sopara cada arquitectura que haya elegido admitir (esto está controlado por sus archivos MAKE), y todos los archivos se colocarán en el directorio libs / de su APK. Cuando se instala el APK, solo .sose seleccionará el apropiado , pero todos deben vivir en el APK inicial.
Devunwired
1
@KonradRudolph puede escribir partes de sus aplicaciones con el ndk, Google lo hace para partes críticas de rendimiento de Android. Excepto en casos muy específicos, c ++ vs java es irrelevante en el desarrollo de Android, especialmente ahora que viene ART. El uso correcto de las API, especialmente aquellas que consumen batería (GPS, red) es donde debes tener cuidado.
Teovald
1
Java es más lento. La JVM necesita cargarse, además el código de bytes es MUY eficiente, pero no es "nativo" y, por lo tanto, tiene una pequeña penalización; dependiendo de la aplicación, esto puede ser notable. En cuanto a por qué eligieron Java, específicamente porque se ejecuta en un intérprete: el recolector de basura reduce los problemas de memoria y reduce el impacto entre aplicaciones. Además, el lenguaje Java (aunque detallado) elimina muchos de los errores introducidos por el desarrollador de C ++.
Daniel
25

Si solo va a desarrollar una aplicación en su vida, use el NDK.

Si su objetivo es aprender el desarrollo de Android con la intención de desarrollar más de una aplicación durante su vida, y desea poder admitirlas todas adecuadamente, es muy probable que lo haga mejor a largo plazo si aprende Java y utilice el SDK de Java de Android en su lugar.

Isaac
fuente
Esta lógica tiene mucho sentido práctico.
vvnraman
8

Los programadores de King usan C ++ para la lógica de su juego. Y parece que les va bien a juzgar por su volumen de ventas.

En mi experiencia, C ++ es para personas que resuelven problemas y Java es para quienes evitan problemas. Me encantan ambos lenguajes, pero C ++ es bastante gratificante cuando escribes un buen código. Sin embargo, puede que solo sean necesarios varios momentos de magia para llegar allí.

También podría recomendar C ++ para los científicos de datos, quienes normalmente harían su trabajo, por ejemplo, con Python o R. C ++ puede hacer lo mismo con un rendimiento igual de bueno o no mejor, pero solo se necesita ser un genio en el lenguaje. Es por eso que nunca había no recomiendo C ++ para el que quiere hacerlo - Yo sólo le daría una mano a mano con el tratamiento que se van a llevar.

JAkerblom
fuente
1
Cualquier tiempo que dedique a resolver problemas que son exclusivos de C ++ es tiempo que podría haber dedicado a desarrollar la funcionalidad real de su aplicación.
user45623
4

Encontré este interesante artículo en: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ se creó específicamente para la independencia de la plataforma y, como tal, se encuentra en todos los sistemas operativos existentes. Su usuario móvil típico puede saber que las aplicaciones de Android están escritas en Java e iOS en Objective-C, pero lo que muchos no saben es que hay más código C / C ++ en la memoria de sus dispositivos que cualquier otra cosa. C / C ++ impulsa gran parte de la tecnología de los dispositivos pequeños (como el kernel, que interactúa con el hardware, así como las bibliotecas de tiempo de ejecución típicas) y las redes de telecomunicaciones que habilitan estos dispositivos. Más importante para un equipo de desarrollo, es que existen interfaces y bibliotecas C / C ++ para cualquier cosa que necesite hacer en cualquier dispositivo y plataforma. El conjunto de herramientas de Android NDK es un gran ejemplo de compatibilidad completa con C / C ++ que se agregó originalmente a los equipos de desarrollo de juegos para permitirles obtener el mejor rendimiento posible del dispositivo evitando Java y el tiempo de ejecución de Java de Android Dalvik, la máquina virtual en la que El código Java de Android se ejecuta en. Se ha mejorado periódicamente para habilitar todos los servicios de Android.

Moussa D.
fuente
3

Yo diría que use java para la aplicación principal. Pero si tiene algún código c ++ que necesita portar o alguna biblioteca que necesita que esté implementada de manera eficiente en c ++, entonces use ndk para esos bits

Dan
fuente
4
Entonces, ¿por qué debería usar Java?
Vladislav Rastrusny
3

No veo ninguna razón para no usar C ++ para el desarrollo normal de Android.Si tiene una amplia experiencia trabajando en C ++ y con sistemas operativos complejos como Windows o cualquier otro, entonces puede comprender Android rápidamente y no es tan complicado como el otros sistemas operativos son. mientras aprende Java o trabaja sin aprender, ¡sería más frustrante y complejo!

stng
fuente
3

La consideración más importante es que el código Java compilado se ejecutará en todos los dispositivos Android sin cambios, mientras que el código nativo deberá compilarse para todas las plataformas de destino.

La intención general tanto para Java como para Android es que escriba la mayoría, si no toda, su aplicación en Java y use cosas nativas solo cuando no haya otra opción ... por lo que todo lo relacionado con la escritura de la aplicación se prestará para hacerlo en Java.

Te ahorrarás muchas molestias al hacer un puente entre los mundos nativo y Java escribiendo en Java.

Además, se hará un gran favor si se lanza y aprende Java. No solo su aplicación de Android será mejor, sino que se expondrá a un enfoque significativamente diferente de OO y será un mejor programador para ello.

Agregue a eso el hecho de que evitará una gran cantidad de riesgos de seguridad al escribir en Java.

En mi opinión, esto es una obviedad: use Java.

Lawrence Dol
fuente
2
"... y usar cosas nativas solo cuando no haya otra opción". ¿Cuándo no puede haber otra opción? ¡Todo en Android se puede lograr a través de Java!
CinCout