Mengapa aplikasi Android tidak harus ditulis dalam C / C ++ karena Anda “lebih suka memprogram dalam C / C ++”? [Tutup]

86

Diperbarui (untuk kejelasan dan untuk mengurangi ambiguitas):

Saya akan mulai mengutak-atik aplikasi android. Saya berencana menulis dalam C ++ menggunakan NDK (karena saya memiliki lebih banyak pengalaman dalam C ++ dan lebih memilihnya daripada Java) tetapi menemukan yang berikut ini di halaman Android NDK :

Anda sebaiknya hanya menggunakan NDK jika itu penting untuk aplikasi Anda — bukan karena Anda lebih suka memprogram dalam C / C ++.

Saya mendapat kesan bahwa Anda harus menggunakan bahasa yang Anda sukai, selama itu sesuai dengan pekerjaan. Adakah yang bisa menjelaskan mengapa sangat disarankan untuk tidak menggunakan C / C ++ untuk pengembangan android?


Asli:

Saya akan mulai mengutak-atik aplikasi seluler, khususnya android yang merupakan OS dari ponsel saya saat ini, dan saya bertanya-tanya apakah menulis aplikasinya dalam C ++ (atau setidaknya intinya, kemudian membungkus di Java) adalah opsi yang dapat diterima.

Beberapa latar belakang, saya jurusan ilmu komputer yang telah mengambil 3 kursus C ++ (intro, menengah, OOP, dan saya mengambil kursus STL di musim semi) dan hanya 1 kursus Java (menengah). Karena itu, saya lebih nyaman dengan C ++ dan lebih memilihnya daripada Java. Saya menemukan yang berikut di halaman Android NDK :

Menggunakan kode native di Android umumnya tidak menghasilkan peningkatan performa yang nyata, tetapi selalu meningkatkan kompleksitas aplikasi Anda. Secara umum, Anda sebaiknya hanya menggunakan NDK jika itu penting untuk aplikasi Anda — bukan karena Anda lebih suka memprogram dalam C / C ++.

  • Saya mendapat kesan bahwa Anda harus menggunakan bahasa yang sesuai dengan pekerjaan dan juga bahasa yang Anda kenal
  • Saya mungkin ingin mem-port aplikasi ke platform seluler lain, seperti iOS, yang mendukung C ++ tetapi tidak java
  • Meskipun Java adalah bahasa tingkat tinggi dan dengan demikian seharusnya membuat pengembangan lebih cepat, saya merasa pengembangan akan lebih lambat karena saya harus mempelajari kembali hampir semuanya (karena saya hanya mengambil satu kelas pada bahasa tersebut)

Nasihat apa pun akan sangat dihargai.

ps: banyak jawaban tentang hal ini berasal dari beberapa tahun yang lalu dan sangat sedikit jawaban lanjutan yang menyebutkan NDK memungkinkan pengembangan aplikasi asli lengkap di Android 2.3 dan yang lebih baru.

Logan Besecker
sumber
1
"Dapat diterima" adalah kata yang aneh - itu pasti mungkin , melalui NDK ...
ildjarn
1
Anda mungkin lebih baik menggigit peluru dan mempelajari Java. Toolkit Android benar-benar dimaksudkan untuk digunakan dari Java, dan waktu yang Anda hemat karena sudah mengetahui C ++ akan dihabiskan dan kemudian beberapa orang mencoba mencari cara untuk membuat semua perangkat Android berfungsi dari C ++. Anggap ini sebagai kesempatan belajar :)
Jeremy Friesner
Secara pribadi, saya akan gigit jari seperti yang dikatakan Jeremy dan hanya mempelajari apa yang harus Anda lakukan dengan Java. Ini sebenarnya tidak boleh bahwa kesepakatan besar bagi Anda untuk belajar relatif cepat.
OmniOwl
Untuk poin pertama Anda, C ++ tidak cocok dengan pekerjaan (berkembang untuk Android) hampir sebaik Java, terlepas dari keakrabannya. Untuk poin kedua, meskipun Android adalah Linux, ada perbedaan besar antara aplikasi Android dan desktop; siklus proses berbeda dan Anda harus berurusan dengan aktivitas, bukan proses, yang merupakan cara pengembangan yang sangat berbeda dibandingkan dengan pengembangan desktop normal. Untuk poin ketiga, mempelajari Android SDK di C ++ akan membutuhkan waktu yang jauh lebih lama daripada mempelajarinya di Java terlebih dahulu (setelah mempelajari Java), dan kemudian beralih ke C ++.
Cornstalks
1
Terlalu banyak orang yang menggunakan istilah "C / C ++" seolah-olah ada satu bahasa dari nama itu. Saya harap Anda tahu bahwa C dan C ++ adalah dua bahasa yang berbeda (meskipun terkait erat) - dan tampaknya C ++, bukan C, yang Anda tanyakan.
Keith Thompson

Jawaban:

107

Pikirkan seperti ini. Anda memiliki kemampuan menggunakan Java SDK untuk membangun aplikasi yang berfungsi penuh yang memanfaatkan 100% API yang tersedia untuk pengembang. Tidak ada yang dapat Anda lakukan dengan NDK yang tidak dapat dilakukan dengan SDK (dari perspektif API), NDK hanya memberikan performa yang lebih tinggi.

Sekarang lihat kebalikannya. Jika Anda memilih untuk menulis aplikasi 100% di NDK, Anda masih dapat menulis aplikasi yang berfungsi penuh, tetapi Anda dibatasi dalam jumlah framework API yang dapat Anda akses. Tidak semua framework Android dapat diakses di lapisan asli; kebanyakan API hanya untuk Java. Itu tidak berarti bahwa semua API yang ANDA butuhkan tidak tersedia di NDK, tetapi tidak ada tempat di dekat SEMUA API yang terekspos.

Selain itu, NDK memperkenalkan kode khusus platform yang memperluas ukuran distribusi Anda. Untuk setiap arsitektur perangkat yang ingin Anda dukung, kode native Anda harus dibuat dalam file .so (satu untuk armv5, armv7, dan x86) semuanya dikemas ke dalam APK yang sama. Duplikasi kode yang dapat dieksekusi ini membuat aplikasi Anda berukuran 3x (yaitu "biner lemak") kecuali Anda mengambil tugas membuat APK terpisah untuk setiap arsitektur saat Anda mendistribusikan aplikasi. Jadi, proses penerapan menjadi sedikit lebih berhasil jika Anda tidak ingin APK Anda bertambah besar secara signifikan.

Sekali lagi, meskipun tidak ada yang melarang Anda melakukan apa yang Anda pilih, hal ini menunjukkan mengapa Google mendeskripsikan Java sebagai metode "pilihan" untuk sebagian besar kode Anda dan jalur yang paling tidak resistennya. Saya harap ini menjelaskan mengapa dokumentasi tersebut diberi kata-kata seperti itu.

devunwired
sumber
1
Terima kasih banyak! Perubahan dalam perspektif adalah bagian besar yang saya lewatkan. Saya tidak sadar bahwa NDK kekurangan beberapa API. Saya juga tidak memikirkan tentang ukuran distribusi; tetapi sekarang sangat masuk akal karena Anda telah memikirkannya (khususnya karena c ++ harus menyertakan semua pustaka standar sedangkan pustaka standar java sudah ada di perangkat). Bisakah Anda menjelaskan sedikit tentang .sofile? Saya sadar bahwa perlu ada kompilasi kode asli yang terpisah untuk setiap arsitektur perangkat keras yang didukung, jadi setiap .sofile memiliki kompilasi terpisah?
Logan Besecker
43
Pembatasan NDK sebenarnya sangat disayangkan. Saya ingin menulis kode berperforma tinggi untuk platform seluler, terutama karena pertimbangan masa pakai baterai. Masalah asli pada platform seluler. Mengapa tidak mendukungnya dengan lebih baik? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph
2
@LoganBesecker Toolchain NDK akan mengkompilasi silang kode Anda menjadi a .sountuk setiap arsitektur yang Anda pilih untuk didukung (ini dikontrol oleh makefiles Anda), dan semua file akan ditempatkan ke dalam direktori libs / APK Anda. Saat APK diinstal, hanya yang sesuai yang .soakan dipilih, tetapi semuanya masih harus aktif di APK awal.
devunwired
1
@KonradRudolph Anda dapat menulis bagian aplikasi Anda dengan ndk, Google melakukan ini untuk kinerja bagian penting Android. Kecuali untuk kasus yang sangat spesifik, c ++ vs java tidak relevan dalam pengembangan Android, terutama sekarang ART akan datang. Penggunaan yang tepat dari API, terutama yang menggunakan baterai (GPS, jaringan) adalah hal yang perlu Anda waspadai.
Teovald
1
Java lebih lambat. JVM perlu dimuat, ditambah byte-code SANGAT efisien, tetapi ini bukan "asli", dan karenanya memiliki penalti kecil - tergantung pada aplikasinya, hal ini mungkin terlihat. Adapun mengapa mereka memilih Java, khususnya karena dijalankan dalam interpreter: pengumpul sampah mengurangi masalah memori dan mengurangi dampak lintas aplikasi. Selain itu, bahasa Java (sementara verbose) menghapus banyak pengembang yang memperkenalkan kesalahan C ++.
Daniel
25

Jika Anda hanya akan mengembangkan satu aplikasi dalam hidup Anda, gunakan NDK.

Jika Anda bertujuan mempelajari pengembangan Android dengan tujuan mengembangkan lebih dari satu aplikasi selama masa hidup Anda - dan ingin dapat mendukung semuanya dengan baik - kemungkinan besar Anda akan berhasil lebih baik dalam jangka panjang jika Anda mempelajari Java dan gunakan SDK Java Android sebagai gantinya.

Isaac
sumber
Logika ini sangat masuk akal secara praktis.
vvnraman
8

Programer di King menggunakan C ++ untuk logika permainan mereka. Dan mereka tampaknya baik-baik saja menilai dari omset mereka.

Menurut pengalaman saya, C ++ untuk pemecah masalah dan Java untuk penghindar masalah. Saya suka kedua bahasa tersebut, tetapi C ++ cukup bermanfaat saat Anda menulis kode yang bagus. Namun, mungkin diperlukan beberapa saat keajaiban untuk sampai ke sana.

Anda juga dapat merekomendasikan C ++ untuk Data scientist, yang biasanya menyelesaikan pekerjaannya dengan, katakanlah, Python atau R. C ++ dapat melakukan hal yang sama dengan kinerja yang baik atau tidak lebih baik, tetapi yang dibutuhkan adalah menjadi jenius dalam bahasa. Itulah mengapa saya tidak pernah tidak merekomendasikan C ++ kepada orang yang ingin melakukannya - saya hanya akan memberikan perhatian pada suguhan yang mereka terima.

JAkerblom
sumber
2
Kapan pun Anda menghabiskan waktu untuk memecahkan masalah yang unik untuk C ++ adalah waktu yang mungkin Anda habiskan untuk membangun fungsionalitas sebenarnya dari aplikasi Anda.
pengguna45623
4

Saya menemukan artikel menarik ini dari: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ dibangun khusus untuk kemandirian platform dan dengan demikian ditemukan di setiap sistem operasi yang ada. Pengguna seluler tipikal Anda mungkin tahu bahwa aplikasi Android ditulis aplikasi Java dan iOS di Objective-C, tetapi yang tidak diketahui banyak orang adalah bahwa ada lebih banyak kode C / C ++ dalam memori di perangkat Anda daripada yang lainnya. C / C ++ menggerakkan banyak teknologi perangkat kecil (seperti kernel, yang berinteraksi dengan perangkat keras, serta pustaka waktu proses yang khas) dan jaringan telekomunikasi yang mengaktifkan perangkat ini. Lebih penting lagi bagi tim pengembangan, adalah bahwa ada antarmuka dan pustaka C / C ++ untuk apa pun yang perlu Anda lakukan di perangkat dan platform apa pun. Perangkat Android NDK adalah contoh bagus dari dukungan penuh C / C ++ yang awalnya ditambahkan untuk tim pengembangan game untuk memungkinkan mereka mendapatkan kinerja terbaik dari perangkat dengan menghindari Java dan Android Java runtime Dalvik, mesin virtual tempat mereka bekerja. Kode Java Android dijalankan pada. Ini telah ditingkatkan secara teratur untuk mengaktifkan setiap layanan Android.

Moussa D.
sumber
3

Saya akan mengatakan menggunakan java untuk aplikasi utama. Tetapi jika Anda memiliki beberapa kode c ++ yang perlu Anda port atau beberapa library yang Anda perlukan yang diimplementasikan secara efisien di c ++, gunakan ndk untuk bit tersebut

Dan
sumber
4
Mengapa dia harus menggunakan Java?
Vladislav Rastrusny
3

Saya tidak melihat alasan untuk tidak menggunakan C ++ untuk pengembangan android normal, Jika Anda memiliki pengalaman yang luas dalam bekerja di C ++ dan dengan OS yang kompleks seperti windows atau semacamnya, maka Anda dapat memahami android dengan cepat dan tidak serumit OS lainnya. sambil belajar java atau bekerja tanpa mempelajarinya akan lebih membuat frustasi dan kompleks!

stng
sumber
3

Pertimbangan terpenting adalah bahwa kode Java yang dikompilasi akan berjalan di semua perangkat android tanpa perubahan, sedangkan kode native perlu dikompilasi untuk semua platform target.

Maksud umum untuk Java dan Android adalah Anda menulis mayoritas jika tidak semua aplikasi Anda di Java dan menggunakan hal-hal asli hanya jika tidak ada pilihan lain ... jadi segala sesuatu tentang menulis aplikasi akan cocok untuk melakukannya di Java.

Anda akan terhindar dari banyak kesulitan dalam menjembatani antara dunia asli dan Jawa dengan menulis di Java.

Selain itu, Anda akan sangat membantu jika Anda berani mengambil risiko dan mempelajari Java. Aplikasi Android Anda tidak hanya akan menjadi lebih baik untuk itu, tetapi Anda akan mengekspos diri Anda pada pendekatan yang sangat berbeda untuk OO dan Anda akan menjadi programmer yang lebih baik untuk itu.

Tambahkan ke fakta bahwa Anda akan mengesampingkan sejumlah besar risiko keamanan dengan menulis di Java.

Dalam pikiran saya, ini adalah cara yang mudah - gunakan Java.

Lawrence Dol
sumber
2
"... dan gunakan yang asli hanya jika tidak ada pilihan lain". Kapan tidak ada pilihan lain? Semua yang ada di Android dapat dicapai melalui Java!
CinCout