Just reviewing the NDK docs, http://developer.android.com/sdk/ndk/index.html, first para states
If you write native code, your applications are still packaged into an .apk file and they still run inside of a virtual machine on the device.
which contradicts the first bullet point for Revision 6,
Adds support for the x86 ABI, which allows you to generate machine code that runs on compatible x86-based Android devices.
Now will my native compile to machine code or byte code for the virtual machine?
–EDIT—
Perhaps I have read that wrong, the application of course runs in the virtual machine while still calling down into explicit, custom, native (machine) code. Sound about right?
Your edit is correct. You still need to create standard activities in java, and use the jni to call native code that you have compiled, a lot like calling some of the APIs which aren’t run in the dalvikVM (such as sqlite). This native code is architecture dependant of course.
AFAIK, this does change with native activity (android 2.3+), but as only a small percentage of phones are running 2.3+, I haven’t investigated it much.
Edit: Think of it this way, with the NDK, your making a library, which you can then use in your app you make using the SDK. With a little know how though, you can put most of your applications smarts into that library, making your app just some glue code around the library.
As a side note though, you can use the NDK to make fully native programs for android, just like you can with any cross-compiler (main method and all). However, unless you’re planning on releasing an android phone in the future, or targeting only users with root, you won’t be doing this because normal users cannot execute a native program without installing it as an app, for fairly obvious (security) reasons.