Why shouldn't an Android app be written in C/C++ because you "simply prefer to program in C/C++"?

JavaAndroidC++

Java Problem Overview


Updated(for clarity and to reduce ambiguity):

I'm going to start tinkering around with android apps. I was planning on writing the in C++ using the NDK (since I have more experience in C++ and prefer it to Java) but came across the following on the Android NDK page:

> you should only use the NDK if it is essential to your > app—never because you simply prefer to program in C/C++.

I was under the impression that you should use the language that you prefer, as long as it fits the job. Could somebody explain why it is so heavily advised not to use C/C++ for android development?


Original:

I'm going to start tinkering around with mobile apps, specifically android which is the OS of my current phone, and I was wondering if writing the app in C++ (or at least the core, then wrapping in Java) was an acceptable option.

Some background, I'm a computer science major who has taken 3 C++ courses(intro, intermediate, OOP, and am taking an STL course in the spring) and only 1 Java course(intermediate). Because of this, I am more comfortable with C++ and prefer it to Java. I came across the following on the Android NDK page:

> Using native code on Android generally does not result in a noticeable > performance improvement, but it always increases your app complexity. > In general, you should only use the NDK if it is essential to your > app—never because you simply prefer to program in C/C++.

  • I was under the impression that you should use the language the fits the job as well as one you're familiar with
  • I may want to port the application to another mobile platform, such as iOS, that supports C++ but not java
  • While Java is a high level language and thus should make development faster, I feel like development would be slower because I would have to relearn almost everything (since I have only taken one class on the language)

Any advice would be much appreciate.

ps: many of the answers on this subject are from years ago and there are very few follow up answers that mention the NDK allowing the development of full native apps on android 2.3 and newer.

Java Solutions


Solution 1 - Java

Think of it this way. You have the ability using the Java SDK to build a full working application that takes advantage of 100% of the APIs available to developers. There is nothing you can do with the NDK that cannot be done with the SDK (from an API perspective), the NDK just provides higher performance.

Now look at it in reverse. If you choose to write an application 100% in the NDK, you can still write a fully functional application, but you are limited in the number of framework APIs you can access. Not all of the Android framework can be accessed at the native layer; most APIs are Java only. That's not to say that all the APIs YOU may need aren't available in the NDK, but nowhere near ALL the APIs are exposed.

Beyond this, the NDK introduces platform-specific code which expands the size of your distribution. For every device architecture you intend to support, your native code must be built into .so files (one for armv5, armv7 and x86) all packaged up into the same APK. This duplication of executable code makes your app 3x the size (i.e. a "fat binary") unless you take on the task of building separate APKs for each architecture when you distribute the application. So the deployment process becomes a bit more work if you don't want your APK to grow in size significantly.

Again, while none of this is prohibits you from doing what you choose, it points out why Google describes Java as the "preferred" method for the majority of your code and the path of least resistance. I hope it sheds some light on why the documentation is worded the way it is.

Solution 2 - Java

If you're only going to develop one app in your life, use the NDK.

If you're aiming at learning Android development with the intention of developing more than one application during your lifetime - and want to be able to properly support them all - you're very likely to do better in the long run if you learn Java and use Android's Java SDK instead.

Solution 3 - Java

The programmers at King use C++ for their game logic. And they seem to be doing fine judging by their turnover.

In my experience, C++ is for problem solvers and Java is for problem avoiders. I love either language, but C++ is quite rewarding when you write good code. However, it may just take several moments of wizardry to get there.

You could recommend C++ for Data scientists as well, who would normally get their job done by, say, Python or R. C++ can do the same with as good or not better performance, but it just takes being a genius in the language. That is why I'd never not recommend C++ to the one that wants to do it - I'd just give a heads up to the treat that they're in for.

Solution 4 - Java

I found this interesting article from: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C++ was built specifically for platform independence and as such is found on every single operating system in existence. Your typical mobile user may know that Android apps are written Java and iOS apps in Objective-C, but what many don’t know is that there is more C/C++ code in memory on your devices than anything else. C/C++ drives much of the technology of small devices (like the kernel, which interacts with the hardware, as well as typical run time libraries) and the telecommunications networks that enable these devices. More importantly for a development team, is that there are C/C++ interfaces and libraries for anything you need to do on any device and platform. The Android NDK toolset is a great example of full C/C++ support that was added originally for game development teams to enable them to get the best possible performance out of the device by avoiding Java and the Android Java runtime Dalvik, the virtual machine on which Android Java code is executed on. It has been regularly improved to enable every Android service.

Solution 5 - Java

The most important consideration is that the compiled Java code will run on all android devices unchanged, whereas the native code will need to be compiled for all target platforms.

The general intent for both Java and Android is that you write the majority if not all your app in Java and use native things only when there is no other option... so everything about writing the app will lend itself to doing so in Java.

You'll spare yourself a lot of aggravation in bridging between the native and Java worlds by writing in Java.

As well, you will do yourself a big favor if you take the plunge and learn Java. Not only will your Android app be the better for it, but you will expose yourself to a significantly different approach to OO and you will be a better programmer for it.

Add to that the fact that you will side-step a whole bunch of security risks by writing in Java.

In my mind, this is a no-brainer - use Java.

Solution 6 - Java

I would say use java for main app. But if you have some c++ code you need to port or some library you need that is efficiently implemented in c++, then use ndk for those bits

Solution 7 - Java

I don't see any reason to not use C++ for normal android development , If you have extensive experience in working in C++ and with complex OS like windows or any other such, then you can grasp android quickly and is not as much complicated as the other OS are. while learning java or working without learning it would be more frustrating and complex !

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLogan BeseckerView Question on Stackoverflow
Solution 1 - JavadevunwiredView Answer on Stackoverflow
Solution 2 - JavaIsaacView Answer on Stackoverflow
Solution 3 - JavaJAkerblomView Answer on Stackoverflow
Solution 4 - JavaMoussa D.View Answer on Stackoverflow
Solution 5 - JavaLawrence DolView Answer on Stackoverflow
Solution 6 - JavaDanView Answer on Stackoverflow
Solution 7 - JavastngView Answer on Stackoverflow