Here’s the nutshell overview from someone who’s done at least a little development for most of the major phone platforms:
Many, many phones have what’s called a J2ME environment. Cheap phones, fancy phones, smartphones, J2ME is nearly everywhere and was touted as the way to write portable phone apps for years. You write your app in java and J2ME is effectively your API and dictates the feature set of the java runtime you’re running in. In theory, this is a standard that you can write your app to and run it anywhere that supports J2ME. In practice, there are enough differences in J2ME platforms that that’s not really true.
Windows Mobile smartphones are programmed by either writing Win32 applications (using e.g. C++ or C) or by writing .NET applications (using e.g. C#) and compiling them using the microsoft smartphone SDK’s. Windows Mobile phones can also run J2ME applications, but they’re sort of second-class citizens (you run a shell application which lets you select a J2ME application to run, and it feels sort of rudimentary and not well-integrated into the rest of the WM environment, as if you were running an emulator or something)
Blackberry applications are written in java using the Blackberry SDK, which is sort of parallel to the J2ME model, with Blackberry-specific extras. You can write a J2ME app and it is pretty much a first-class citizen on Blackberry, but you lose access to the extras you’d get if you used the “native” Blackberry APIs instead (examples: trackball API, background apps).
Symbian phones are programmed using C++ and the Symbian SDK. Many Symbian phones also run J2ME apps.
iPhone applications are written by writing in Objective-C and using the iPhone SDK, as mentioned above. No J2ME.
Android applications are written in java using the Android SDK. I don’t know if Android can run J2ME apps or not, but I think not.
So generally, the bottom line is that for the modern big phone platforms, you need their SDK and that basically dictates the programming language. J2ME was designed and touted as the way to write portable phone apps, but it’s really dying out and is really only useful if you want to target low-end phones nowadays. Windows Mobile offers a choice of languages because they have .NET, but honestly, nobody cares about Windows Mobile (and all the .NET languages aren’t really supported by their mobile tools anyway. You get C# or C++, basically.).