The main difference is that most other platforms run in native code
and then VM languages bind to that native code (e.g. Python/Java
calling out to syscalls, WINAPI functions, etc...) while Android OS
actually is written and runs IN Java. As soon as basic Linux kernel
is up, Dalvik is started and THEN the rest the OS (UI compositor,
audio manager, process/activity manager, SurfaceFlinger, etc.) is
loaded as Java classes. Android is basically Java code that calls out
to native code for acceleration (like most Python libraries) not the
other way around as you're used to from other platforms. Think of
Android more like "boot to Java" than a Linux distribution.
Which means there are no native calls to be called - whole Android
API is a Java API. So if you want to implement another language or
write an app in C, you need to still have a JNI bridge between your
language/code and Dalvik which lets you call Android to draw UI on
screen, access data about filesystem, system services, schedule
service startups, add icon to launcher, show notifications, ...
anything really.