Neden bir Android uygulaması C / C ++ ile yazılmasın çünkü "sadece C / C ++ ile programlamayı tercih ediyorsunuz"? [kapalı]


86

Güncellendi (netlik sağlamak ve belirsizliği azaltmak için):

Android uygulamalarla uğraşmaya başlayacağım. NDK'yı kullanarak C ++ 'da yazmayı planlıyordum (çünkü C ++ konusunda daha fazla deneyimim olduğu ve Java'yı tercih ettiğim için) ancak Android NDK sayfasında aşağıdakilerle karşılaştım :

NDK'yı yalnızca uygulamanız için gerekliyse kullanmalısınız - asla sadece C / C ++ ile programlamayı tercih ettiğinizden değil.

İşe uygun olduğu sürece tercih ettiğiniz dili kullanmanız gerektiği izlenimine kapıldım. Android geliştirme için C / C ++ kullanmamanın neden bu kadar şiddetle tavsiye edildiğini birisi açıklayabilir mi?


Orijinal:

Mobil uygulamalarla, özellikle de mevcut telefonumun işletim sistemi olan android ile uğraşmaya başlayacağım ve uygulamayı C ++ 'da (veya en azından çekirdek, ardından Java ile sarmalama) yazmanın kabul edilebilir bir seçenek olup olmadığını merak ediyordum.

Biraz geçmişim, 3 C ++ dersi (giriş, orta seviye, OOP ve baharda bir STL kursu alıyorum) ve sadece 1 Java dersi (orta seviye) almış bir bilgisayar bilimi uzmanıyım. Bu yüzden C ++ ile daha rahatım ve Java'ya tercih ediyorum. Android NDK sayfasında aşağıdakilere rastladım :

Android'de yerel kod kullanmak genellikle gözle görülür bir performans artışı sağlamaz, ancak her zaman uygulamanızın karmaşıklığını artırır. Genel olarak, NDK'yı yalnızca uygulamanız için gerekliyse kullanmalısınız - hiçbir zaman sadece C / C ++ ile programlamayı tercih etmediğiniz için.

  • İşe uygun ve aşina olduğunuz dili kullanmanız gerektiği izlenimine kapıldım.
  • Uygulamayı iOS gibi C ++ destekleyen ancak java desteklemeyen başka bir mobil platforma taşımak isteyebilirim
  • Java yüksek seviyeli bir dil olmasına ve bu nedenle geliştirmeyi hızlandırması gerekirken, gelişimin daha yavaş olacağını hissediyorum çünkü neredeyse her şeyi yeniden öğrenmem gerekiyor (çünkü dil üzerine sadece bir ders aldım)

Herhangi bir tavsiye çok minnettar olacaktır.

ps: Bu konudaki yanıtların çoğu yıllar öncesine aittir ve Android 2.3 ve daha yeni sürümlerde tam yerel uygulamaların geliştirilmesine izin veren NDK'dan bahseden çok az yanıt vardır.


1
"Kabul edilebilir" tuhaf bir kelime - kesinlikle mümkün , NDK aracılığıyla ...
ildjarn

1
Muhtemelen kurşunu ısırıp Java öğrenmen daha iyi. Android araç seti gerçekten Java'dan kullanılmak üzere tasarlanmıştır ve zaten C ++ 'yı bilmekten tasarruf edeceğiniz zaman harcanır ve daha sonra bazıları tüm Android öğelerinin C ++' dan nasıl çalıştırılacağını anlamaya çalışır. Bunu bir öğrenme fırsatı olarak düşünün :)
Jeremy Friesner

Kişisel olarak Jeremy'nin dediği gibi mermiyi ısırırdım ve sadece Java ile ne yapmanız gerektiğini öğrenirdim. Aslında onu nispeten hızlı öğrenmeniz o kadar da büyük bir mesele olmamalı .
OmniOwl

İlk noktanız için, C ++, aşinalık ne olursa olsun, işe neredeyse Java kadar uymuyor (Android için geliştirme). İkinci olarak, Android'in Linux olmasına rağmen, Android ve masaüstü uygulamaları arasında büyük bir fark var; yaşam döngüleri farklıdır ve süreçler yerine faaliyetlerle uğraşmanız gerekir, bu da normal masaüstü geliştirmeye kıyasla tamamen farklı bir geliştirme yolu. Üçüncü noktanız için, Android SDK'yı C ++ 'da öğrenmek, önce Java'da öğrenmenizden (Java'yı öğrendikten sonra) ve ardından C ++' ya geçmenizden önemli ölçüde daha uzun sürecektir.
Cornstalks

1
Çok fazla insan "C / C ++" terimini, sanki o isimde tek bir dil varmış gibi kullanır. Umarım C ve C ++ 'nın iki farklı (yakından ilişkili) dil olduğunun farkındasındır - ve sorduğun C değil, C ++ gibi görünüyor.
Keith Thompson

Yanıtlar:


107

Bu şekilde düşün. Geliştiricilere sunulan API'lerin% 100'ünden yararlanan tam çalışan bir uygulama oluşturmak için Java SDK kullanma yeteneğine sahipsiniz. SDK ile yapılamayan NDK ile yapabileceğiniz hiçbir şey yoktur (API perspektifinden), NDK sadece daha yüksek performans sağlar.

Şimdi tersine bakın. NDK'da% 100 bir uygulama yazmayı seçerseniz, yine de tamamen işlevsel bir uygulama yazabilirsiniz, ancak erişebileceğiniz çerçeve API'lerinin sayısı sınırlıdır. Yerel katmanda tüm Android çerçevesine erişilemez; çoğu API yalnızca Java'dır. Hepsi bu API'ler söylemek değil SİZ gerekebilir NDK bulunmayan, ama hiçbir yerde yakın TÜM API'ler maruz kalırlar.

Bunun ötesinde, NDK, dağıtımınızın boyutunu genişleten platforma özgü kod sunar. Desteklemeyi düşündüğünüz her cihaz mimarisi için, yerel kodunuzun tümü aynı APK içinde paketlenmiş .so dosyalarına (armv5, armv7 ve x86 için bir tane) yerleştirilmelidir. Yürütülebilir kodun bu şekilde çoğaltılması, uygulamayı dağıtırken her mimari için ayrı APK'ler oluşturma görevini üstlenmediğiniz sürece uygulamanızı 3 kat daha büyük hale getirir (yani bir "katı ikili"). Dolayısıyla, APK'nizin boyutunun önemli ölçüde büyümesini istemiyorsanız, dağıtım süreci biraz daha fazla iş haline gelir.

Yine, bunların hiçbiri seçtiğiniz şeyi yapmanızı engellemese de, Google'ın neden Java'yı kodunuzun çoğu için "tercih edilen" yöntem ve en az dirençli yol olarak tanımladığını belirtir. Umarım belgelerin neden bu şekilde yazıldığına biraz ışık tutar.


1
Çok teşekkür ederim! Bakış açımdaki değişiklik, kaçırdığım en büyük kısımdı. NDK'nın bazı API'lerden yoksun olduğunun farkında değildim. Ayrıca dağılımın boyutunu da düşünmüyordum; ama şimdi bunu aklınıza getirmiş olmanız çok mantıklı geliyor (özellikle c ++ 'ın tüm standart kitaplıkları içermesi gerektiği, oysa java'nın standart kitaplıkları zaten aygıtlarda açık olduğu için). .soDosyalar hakkında biraz bilgi verebilir misiniz ? Desteklenen her donanım mimarisi için ayrı bir yerel kod derlemesi olması gerektiğinin farkındayım, bu nedenle her .sodosyanın ayrı bir derlemesi var mı?
Logan Besecker

43
NDK'nın kısıtlanması aslında üzücü. Mobil platformlar için yüksek performanslı kod yazmayı çok isterim, çünkü pil ömrü ile ilgili hususlar. Mobil platformlarda yerel konular . Neden daha iyi desteklemiyorsunuz? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph

2
@LoganBesecker NDK araç zinciri, .sodesteklemeyi seçtiğiniz her mimari için kodunuzu çapraz derler (bu, makefile dosyalarınız tarafından kontrol edilir) ve tüm dosyalar APK'nızın libs / dizinine yerleştirilir. APK yüklendiğinde, yalnızca uygun olan .soseçilecektir, ancak hepsinin yine de ilk APK'da yaşaması gerekir.
10'da devunwired

1
@KonradRudolph ndk ile uygulamalarınızın bölümlerini yazabilirsiniz, Google bunu Android'in performans açısından kritik bölümleri için yapar. Çok özel durumlar haricinde, c ++ vs java Android geliştirmede önemsizdir, özellikle artık ART geliyor. API'lerin, özellikle pil tüketenlerin (GPS, ağ) doğru kullanımı, dikkatli olmanız gereken yerdir.
Teovald

1
Java yavaştır. JVM'nin yüklenmesi gerekir, artı bayt kodu ÇOK verimlidir, ancak "yerel" değildir ve bu nedenle küçük bir cezası vardır - uygulamaya bağlı olarak bu fark edilebilir. Neden Java'yı seçtiklerine gelince, özellikle bir yorumlayıcıda çalıştığı için: çöp toplayıcı bellek sorunlarını azaltır ve uygulamalar arası etkileri azaltır. Ek olarak, Java dili (ayrıntılı iken), geliştiricinin getirdiği C ++ hatalarının çoğunu kaldırır.
Daniel

25

Hayatınızda yalnızca bir uygulama geliştirecekseniz, NDK'yı kullanın.

Yaşamınız boyunca birden fazla uygulama geliştirme niyetiyle Android geliştirmeyi öğrenmeyi hedefliyorsanız ve hepsini doğru bir şekilde destekleyebilmek istiyorsanız, Java öğrenirseniz uzun vadede daha iyi bir sonuç elde edebilirsiniz bunun yerine Android'in Java SDK'sını kullanın.


Bu mantık çok pratik anlam ifade ediyor.
vvnraman

8

King'deki programcılar oyun mantıkları için C ++ kullanıyor. Ve cirolarına bakılırsa iyi gidiyor gibi görünüyorlar.

Deneyimlerime göre, C ++ problem çözücüler içindir ve Java problemleri önleyenler içindir. Her iki dili de seviyorum, ancak C ++ iyi bir kod yazdığınızda oldukça tatmin edici. Ancak, oraya ulaşmak birkaç dakika sihirbazlık alabilir.

Normalde işlerini Python veya R. C ++ gibi iyi veya daha iyi performansla yapabilen Veri bilimcileri için de C ++ 'yı önerebilirsiniz, ancak bu dilde bir dahi olmayı gerektirir. Ben asla neden değil sadece onlar için içinde olduğumuzu bir tedavi etmek için uyarmak istiyorum - bunu yapmak isteyen birine ++ C önerilir.


2
C ++ 'ya özgü sorunları çözmek için harcadığınız her zaman, uygulamanızın gerçek işlevselliğini oluşturmak için harcayabileceğiniz zamandır.
user45623

4

Bu ilginç makaleyi şu adresten buldum: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++, özellikle platform bağımsızlığı için oluşturulmuştur ve bu nedenle var olan her işletim sisteminde bulunur. Tipik mobil kullanıcınız, Android uygulamalarının Objective-C'de Java ve iOS uygulamaları yazdığını biliyor olabilir, ancak birçok kişinin bilmediği şey, cihazlarınızda her şeyden daha fazla C / C ++ kodu olduğudur. C / C ++, küçük cihazların teknolojisinin çoğunu (donanımla etkileşime giren çekirdek ve tipik çalışma süresi kitaplıkları gibi) ve bu cihazları etkinleştiren telekomünikasyon ağlarını yönetir. Bir geliştirme ekibi için daha da önemlisi, herhangi bir cihaz ve platformda yapmanız gereken her şey için C / C ++ arayüzleri ve kitaplıkları olmasıdır. Android NDK araç seti, Java ve Android Java çalışma zamanı Dalvik'ten kaçınarak cihazdan mümkün olan en iyi performansı elde etmelerini sağlamak için oyun geliştirme ekipleri için orijinal olarak eklenen tam C / C ++ desteğinin harika bir örneğidir. Android Java kodu çalıştırılır. Her Android hizmetini etkinleştirmek için düzenli olarak geliştirildi.


3

Ana uygulama için java kullan diyebilirim. Ancak, eğer bir c ++ kodunuz varsa, c ++ 'da verimli bir şekilde uygulanmış bir kütüphaneye veya bir kütüphaneye ihtiyacınız varsa, o zaman bu bitler için ndk kullanın


4
O zaman neden Java kullanmalı?
Vladislav Rastrusny

3

Normal android geliştirme için C ++ kullanmamak için herhangi bir neden görmüyorum, C ++ 'da ve pencereler gibi karmaşık işletim sistemlerinde geniş deneyime sahipseniz, o zaman androidi hızlı bir şekilde kavrayabilirsiniz ve o kadar karmaşık değildir. diğer işletim sistemleri. Java öğrenirken veya öğrenmeden çalışırken daha sinir bozucu ve karmaşık olurdu!


3

Dikkat edilmesi gereken en önemli nokta, derlenen Java kodunun tüm android cihazlarda değişmeden çalışacağı, oysa yerel kodun tüm hedef platformlar için derlenmesi gerektiğidir.

Hem Java hem de Android için genel amaç, uygulamanızın tamamını olmasa da çoğunluğunu Java'da yazmanız ve yerel şeyleri yalnızca başka bir seçenek olmadığında kullanmanızdır ... bu nedenle, uygulamayı yazmakla ilgili her şey Java'da bunu yapmaya uygun olacaktır.

Java ile yazarak yerel ve Java dünyaları arasında köprü kurmakta kendinizi çok fazla sıkıntıdan kurtaracaksınız.

Ayrıca, dalıp Java öğrenirseniz, kendinize büyük bir iyilik yapacaksınız. Sadece Android uygulamanız bunun için daha iyi olmayacak, aynı zamanda kendinizi OO'ya önemli ölçüde farklı bir yaklaşıma maruz bırakacak ve bunun için daha iyi bir programcı olacaksınız.

Buna Java ile yazarak bir dizi güvenlik riskini ortadan kaldıracağınız gerçeğini ekleyin.

Bence bu çok basit - Java kullanın.


2
"... ve yerel şeyleri yalnızca başka seçenek olmadığında kullanın". Ne zaman başka seçenek olamaz? Android'deki her şeye Java ile ulaşılabilir!
CinCout
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.