Start with the proposition that an application has a user interface. How do you want that to look and behave? You have 4 choices.
- Android native. You're going to write Java, but you can extend it in C++ using the NDK.
- Renderer. You can write any language you like because you're going to be drawing your own widgets on a render surface, and they won't be native.
- Somebody's devkit. It will eventually do one of the above. Xamarin, Qpython, QT, etc. Whatever.
There is a lot to read eg (https://stackoverflow.com/questions/101754/is-there-any-way-to-run-python-on-android). None of it matters until you decide what kind of UI you want. If you want native you are going to write Java.
In answer to your questions:
- Yes, can write and run code, basically via the NDK or similar. Doesn't help with the UI.
- Dunno, but once you get down to the NDK you can do most stuff.
- Ubuntu is not Android. I'll leave that to others.
Regarding the NDK, I can tell you that it provides a reasonably fully-featured C++ development environment. Most (but not all) standard C++ library features are provided, as well as a set of APIs that hook into the Android process APIs (so you can write Activities entirely in C++), and a JNI capability.
There are device APIs (things like the accelerometer and GPS) that are intended to be accessed from Java, so we go via JNI. You may be able to access devices directly from C++, but I would expect you would tend to lose portability (across manufacturers) and higher level features.
Below that there are device drivers, a HAL, a Linux kernel and other interesting things. If that's where you want to play, there is plenty to read: http://s.android.com/devices/index.html.