Почему не следует писать Android-приложение на C / C ++, потому что вы «просто предпочитаете программировать на C / C ++»? [закрыто]

86

Обновлено (для ясности и уменьшения двусмысленности):

Я собираюсь начать возиться с приложениями для Android. Я планировал написать на C ++ с помощью NDK (поскольку у меня больше опыта работы с C ++ и я предпочитаю его Java), но на странице Android NDK наткнулся на следующее :

вам следует использовать NDK только в том случае, если он важен для вашего приложения - никогда, потому что вы просто предпочитаете программировать на C / C ++.

У меня сложилось впечатление, что вы должны использовать тот язык, который вам больше нравится, если он подходит для работы. Может ли кто-нибудь объяснить, почему так настоятельно рекомендуется не использовать C / C ++ для разработки Android?


Оригинал:

Я собираюсь начать возиться с мобильными приложениями, в частности с Android, который является ОС моего текущего телефона, и мне было интересно, приемлемо ли написание приложения на C ++ (или, по крайней мере, на ядре, а затем на Java).

Немного предыстории, я специализируюсь на информатике, прошел 3 курса C ++ (вводный, промежуточный, ООП, весной я беру курс STL) и только 1 курс Java (средний уровень). Из-за этого мне удобнее работать с C ++, и я предпочитаю его Java. На странице Android NDK я обнаружил следующее :

Использование собственного кода на Android обычно не приводит к заметному повышению производительности, но всегда увеличивает сложность вашего приложения. В общем, вы должны использовать NDK только в том случае, если это важно для вашего приложения - никогда, потому что вы просто предпочитаете программировать на C / C ++.

  • У меня сложилось впечатление, что вы должны использовать язык, который подходит для работы, а также тот, с которым вы знакомы
  • Возможно, я захочу перенести приложение на другую мобильную платформу, например iOS, которая поддерживает C ++, но не java.
  • Хотя Java является языком высокого уровня и, следовательно, должен ускорить разработку, я чувствую, что разработка будет медленнее, потому что мне придется переучивать почти все (поскольку я взял только один класс на этом языке)

Любой совет был бы очень признателен.

ps: многие ответы на эту тему были получены много лет назад, и очень мало последующих ответов, в которых упоминается NDK, позволяющий разрабатывать полные нативные приложения на Android 2.3 и новее.

Логан Бесеккер
источник
1
«Приемлемый» - странное слово - это, конечно, возможно , через NDK ...
ildjarn
1
Возможно, вам лучше перекусить и изучить Java. Инструментарий Android действительно предназначен для использования с Java, и время, которое вы сэкономили бы, зная C ++, вы потратите, а затем некоторые попытки выяснить, как заставить все вещи Android работать с C ++. Думайте об этом как о возможности для обучения :)
Джереми Фриснер
Лично я бы перекусил, как сказал Джереми, и просто узнал бы, что вам нужно с Java. Это на самом деле не должно быть , что большое дело для вас , чтобы узнать его относительно быстро.
OmniOwl
Прежде всего, C ++ не подходит для работы (разработка для Android) почти так же хорошо, как Java, независимо от того, насколько он вам знаком. Во-вторых, несмотря на то, что Android - это Linux, между Android и настольными приложениями огромная разница; жизненные циклы разные, и вам приходится иметь дело с действиями, а не с процессами, что является совершенно другим способом разработки по сравнению с обычной настольной разработкой. Что касается вашего третьего пункта, изучение Android SDK на C ++ займет у вас значительно больше времени, чем сначала выучите его на Java (после изучения Java), а затем переключитесь на C ++.
Cornstalks
1
Слишком много людей используют термин «C / C ++», как будто существует один язык с таким названием. Я надеюсь, вы знаете, что C и C ++ - это два разных (хотя и тесно связанных) языка, и, похоже, вы спрашиваете о C ++, а не о C.
Кейт Томпсон

Ответы:

107

Подумайте об этом так. У вас есть возможность использовать Java SDK для создания полноценного рабочего приложения, которое использует все преимущества API-интерфейсов, доступных разработчикам. С NDK ничего нельзя сделать, чего нельзя было бы сделать с SDK (с точки зрения API), NDK просто обеспечивает более высокую производительность.

Теперь посмотрим на это наоборот. Если вы решите написать приложение на 100% в NDK, вы все равно можете написать полнофункциональное приложение, но вы ограничены в количестве API-интерфейсов инфраструктуры, к которым вы можете получить доступ. Не все платформы Android доступны на собственном уровне; большинство API - это только Java. Это не означает, что все API-интерфейсы, которые могут вам понадобиться, недоступны в NDK, но далеко не ВСЕ API-интерфейсы доступны.

Помимо этого, NDK вводит программно-зависимый код, который увеличивает размер вашего дистрибутива. Для каждой архитектуры устройства, которую вы собираетесь поддерживать, ваш собственный код должен быть встроен в файлы .so (один для armv5, armv7 и x86) и все они упакованы в один APK. Это дублирование исполняемого кода увеличивает размер вашего приложения в 3 раза (т. Е. «Толстый двоичный файл»), если вы не берете на себя задачу создания отдельных APK для каждой архитектуры при распространении приложения. Таким образом, процесс развертывания становится немного сложнее, если вы не хотите, чтобы ваш APK значительно увеличился в размере.

Опять же, хотя ничто из этого не запрещает вам делать то, что вы выбираете, это указывает на то, почему Google описывает Java как «предпочтительный» метод для большей части вашего кода и путь наименьшего сопротивления. Я надеюсь, что это проливает свет на то, почему документация сформулирована именно так.

пожертвованный
источник
1
Большое спасибо! Изменение перспективы было большой частью, которую мне не хватало. Я не знал, что в NDK не хватает API. Я также не думал о размере распределения; но теперь, когда вы вспомнили об этом, это имеет большой смысл (особенно потому, что c ++ должен включать все стандартные библиотеки, тогда как стандартные библиотеки java уже включены на устройствах). Не могли бы вы немного рассказать о .soфайлах? Я знаю, что для каждой поддерживаемой аппаратной архитектуры требуется отдельная компиляция собственного кода, поэтому каждый .soфайл должен иметь отдельную компиляцию?
Logan Besecker
43
На самом деле ограничение NDK очень жаль. Я хотел бы написать высокопроизводительный код для мобильных платформ, в основном из-за соображений времени автономной работы. Родные вопросы на мобильных платформах. Почему бы не поддержать это лучше? # ᴅɪꜱʟɪᴋᴇ
Конрад Рудольф
2
@LoganBesecker Цепочка инструментов NDK будет кросс-компилировать ваш код .soдля каждой архитектуры, которую вы выбрали для поддержки (это контролируется вашими make-файлами), и все файлы будут помещены в каталог libs / вашего APK. После установки APK .soбудут выбраны только подходящие , но все они должны находиться в исходном APK.
devunwired
1
@KonradRudolph, вы можете писать части своих приложений с помощью ndk, Google делает это для критически важных частей Android. За исключением очень конкретных случаев, c ++ vs java не имеют отношения к разработке Android, особенно сейчас, когда приходит ART. При правильном использовании API, особенно тех, которые потребляют батарею (GPS, сеть), следует соблюдать осторожность.
Teovald
1
Java работает медленнее. JVM необходимо загрузить, плюс байт-код ОЧЕНЬ эффективен, но он не является «родным» и, следовательно, имеет небольшой штраф - в зависимости от приложения это может быть заметно. Что касается того, почему они выбрали Java, особенно потому, что она работает в интерпретаторе: сборщик мусора уменьшает проблемы с памятью и снижает влияние между приложениями. Кроме того, язык Java (хотя и подробный) устраняет многие ошибки C ++, внесенные разработчиком.
Дэниел
25

Если вы собираетесь разработать только одно приложение в своей жизни, используйте NDK.

Если вы стремитесь изучить разработку Android с намерением разработать более одного приложения в течение своей жизни - и хотите иметь возможность должным образом поддерживать их все, - вы, скорее всего, добьетесь большего успеха в долгосрочной перспективе, если изучите Java и вместо этого используйте Android Java SDK.

Исаак
источник
Эта логика имеет большой практический смысл.
vvnraman
8

Программисты King используют C ++ для своей игровой логики. И, судя по текучести, у них все в порядке.

По моему опыту, C ++ предназначен для тех, кто решает проблемы, а Java - для тех, кто их избегает. Мне нравятся оба языка, но C ++ очень полезен, когда вы пишете хороший код. Однако, чтобы добраться туда, может потребоваться несколько мгновений волшебства.

Вы также можете порекомендовать C ++ для специалистов по обработке данных, которые обычно выполняют свою работу, скажем, Python или R. C ++ может делать то же самое с такой же или не лучшей производительностью, но для этого нужно просто быть гением в языке. Вот почему я бы никогда не рекомендовал C ++ тому, кто хочет это сделать - я бы просто предупредил о том, что их ждет.

JAkerblom
источник
1
Каждый раз, когда вы тратите время на решение проблем, уникальных для C ++, это время, которое вы могли бы потратить на создание реальной функциональности вашего приложения.
user45623
4

Я нашел эту интересную статью по адресу : http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ был создан специально для обеспечения независимости от платформы и поэтому присутствует во всех существующих операционных системах. Ваш типичный мобильный пользователь может знать, что приложения для Android написаны для Java и iOS на Objective-C, но многие не знают, что в памяти ваших устройств больше кода C / C ++, чем чего-либо еще. C / C ++ управляет большей частью технологий малых устройств (таких как ядро, которое взаимодействует с оборудованием, а также типичными библиотеками времени выполнения) и телекоммуникационными сетями, которые обеспечивают работу этих устройств. Что еще более важно для команды разработчиков, это наличие интерфейсов и библиотек C / C ++ для всего, что вам нужно делать на любом устройстве и платформе. Набор инструментов Android NDK - отличный пример полной поддержки C / C ++, которая была первоначально добавлена ​​для команд разработчиков игр, чтобы позволить им получить максимально возможную производительность от устройства, избегая Java и среды выполнения Android Java Dalvik, виртуальной машины, на которой Java-код Android выполняется на. Он регулярно улучшался, чтобы включить все службы Android.

Мусса Д.
источник
3

Я бы сказал, используйте java для основного приложения. Но если у вас есть код C ++, который вам нужно перенести, или какая-то библиотека, которая вам нужна, которая эффективно реализована на C ++, тогда используйте ndk для этих бит.

Дэн
источник
4
Зачем тогда ему использовать Java?
Владислав Раструсный
3

Я не вижу причин не использовать C ++ для нормальной разработки Android. Если у вас есть большой опыт работы на C ++ и со сложной ОС, такой как Windows или любая другая, тогда вы можете быстро освоить Android, и это не так сложно, как другие ОС есть. при изучении java или работе без обучения это было бы труднее и сложнее!

stng
источник
3

Наиболее важным соображением является то, что скомпилированный код Java будет работать на всех устройствах Android без изменений, тогда как собственный код необходимо будет скомпилировать для всех целевых платформ.

Общая цель как для Java, так и для Android заключается в том, чтобы вы пишете большую часть, если не все свое приложение на Java, и используете нативные вещи только тогда, когда нет другого варианта ... поэтому все, что касается написания приложения, поддается тому, чтобы делать это на Java.

Вы избавите себя от множества неприятностей при наведении мостов между родным миром и миром Java, написав на Java.

Кроме того, вы окажете себе большую услугу, если решитесь и выучите Java. Мало того, что ваше приложение для Android станет лучше для этого, вы также познакомитесь с совершенно другим подходом к объектно-ориентированному программированию и станете лучшим программистом для него.

Добавьте к этому тот факт, что вы обойдете целый ряд рисков безопасности, написав на Java.

На мой взгляд, это простая задача - используйте Java.

Лоуренс Дол
источник
2
«... и пользоваться родными вещами только тогда, когда другого выхода нет». Когда не может быть другого выхода? Все на Android можно сделать с помощью Java!
CinCout,