Чому додаток для Android не слід писати на C / C ++, тому що ви "просто віддаєте перевагу програмуванню на C / C ++"? [зачинено]


86

Оновлено (для ясності та зменшення двозначності):

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

вам слід використовувати NDK лише в тому випадку, якщо це важливо для вашого додатка - ніколи, тому що ви просто віддаєте перевагу програмуванню на C / C ++.

У мене склалося враження, що ти повинен користуватися тією мовою, яку ти віддаєш перевагу, якщо це відповідає роботі. Хтось може пояснити, чому так настійно не рекомендується використовувати C / C ++ для розробки Android?


Оригінал:

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

Деякий досвід: я спеціаліст з інформатики, який пройшов 3 курси C ++ (вступний, середній, OOP і навесні проходжу курс STL) і лише 1 курс Java (середній). Через це мені зручніше користуватися C ++ і віддаю перевагу йому, ніж Java. На сторінці NDK для Android я натрапив на таке :

Використання власного коду на 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 для створення повноцінної робочої програми, яка використовує 100% 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

42
Обмеження НДК насправді шкода. Я хотів би написати високопродуктивний код для мобільних платформ, головним чином з міркувань щодо часу автономної роботи. Рідні питання на мобільних платформах. Чому б не підтримати його краще? # ᴅɪꜱʟɪᴋᴇ
Конрад Рудольф

2
@LoganBesecker Мережа інструментів NDK перехресно зкомпілює ваш код .soдля кожної архітектури, яку ви вибрали для підтримки (це контролюється вашими make-файлами), і всі файли будуть розміщені у каталозі libs / вашого APK. Після встановлення файлу .apk .soбуде вибрано лише відповідний файл , але всі вони все ще мають жити у початковому файлі .apk.
позбавлений права

1
@KonradRudolph, ви можете писати частини своїх програм за допомогою ndk, Google робить це для критично важливих частин Android. За винятком дуже конкретних випадків, c ++ проти Java не має значення у розробці Android, особливо зараз, коли виходить ART. Правильним використанням API, особливо тих, які споживають заряд акумулятора (GPS, мережа), є те, де потрібно бути обережним.
Teovald

1
Java працює повільніше. JVM потрібно завантажити, плюс байт-код ДУЖЕ ефективний, але він не є "рідним", а отже, має невелику штрафну санкцію - залежно від програми це може бути помітним. Що стосується того, чому вони обрали Java, саме тому, що вона працює в інтерпретаторі: збирач сміття зменшує проблеми з пам’яттю та зменшує вплив між додатками. Крім того, мова Java (поки багатослівна) усуває багато помилок, внесених розробником C ++.
Даніель

25

Якщо ви збираєтеся розробити лише одне додаток у своєму житті, використовуйте NDK.

Якщо ви націлені на вивчення розробки Android з метою розробити більше одного додатка протягом свого життя - і хочете мати можливість належним чином підтримувати їх усі, - ви, швидше за все, в кінцевому підсумку зробите краще, якщо вивчите Java та замість цього використовуйте Java SDK для Android.


Ця логіка має багато практичного сенсу.
vvnraman

8

Програмісти King використовують C ++ для своєї ігрової логіки. І, здається, вони чудово справляються, судячи з їхнього обороту.

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

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


1
Кожен час, який ви витрачаєте на вирішення проблем, характерних для С ++, - це час, який ви могли витратити на створення фактичної функціональності вашого додатка.
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 та середовища виконання Java Java Dalvik, віртуальної машини, на якій Код Android Java виконується на. Його регулярно вдосконалювали, щоб увімкнути кожну службу Android.


3

Я б сказав, використовуйте Java для основного додатка. Але якщо у вас є код с ++, який вам потрібно портувати, або потрібна бібліотека, яка ефективно реалізована в с ++, тоді використовуйте ndk для цих бітів


4
Чому він тоді повинен використовувати Java?
Владислав Раструсний

3

Я не бачу жодної причини не використовувати C ++ для нормальної розробки Android. Якщо у вас є великий досвід роботи в C ++ і зі складними ОС, такими як Windows або будь-яка інша така, ви можете швидко зрозуміти android і не так складно, як інші ОС є. в той час як вивчення Java або робота без навчання це було б більш неприємним і складним!


3

Найважливішим фактором є те, що скомпільований код Java буде працювати на всіх пристроях Android без змін, тоді як власний код потрібно буде скомпілювати для всіх цільових платформ.

Загальний намір як для Java, так і для Android полягає в тому, що ви пишете більшість, якщо не всю програму на Java, і використовуєте рідні речі лише тоді, коли немає іншого варіанту ... так що все, що стосується написання програми, буде спроможним робити це на Java.

Ви позбавите себе великого загострення у наведенні мостів між рідним та світом Java, пишучи на Java.

Окрім того, ви зробите собі велику послугу, якщо поринете і вивчите Java. Мало того, що ваш додаток для Android буде кращим для нього, але ви піддастеся суттєво іншому підходу до ОО, і ви станете кращим програмістом для нього.

Додайте до цього той факт, що ви побічно поглибите цілу купу ризиків для безпеки, написавши на Java.

На мою думку, це непросте використання Java.


2
"... і використовувати рідні речі лише тоді, коли немає іншого варіанту". Коли не може бути іншого варіанту? Все на Android можна досягти за допомогою Java!
CinCout
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.