J2ME is the most widely deployed runtime on mobile phones wordwide.
There are still phones that don't support it:
- closed phones (they don't let you install any application)
- Android
- iPhone
- The recent Palm WebOS phones.
- I don't know whether the recent Samsung Bada phones support J2ME
- I expect that some of the mobile linux handsets don't include J2ME by default (check Nokia's Maemo/Meego, Limo is used by Samsung among others...)
- ...
All in all, a large majority of the existing mobile phones in use today support J2ME.
The problem in developing an application that needs to support many handset models in many different countries is J2ME's curse: the dreaded fragmentation.
J2ME itself usually means the JSR-118 specification, along with a whole bunch of other optional APIs specified in JSR-75, JSR-82, JSR-120, JSR-135, JSR-139, JSR-172, JSR-177, JSR-179, JSR-180, JSR-184, JSR-185, JSR-205, JSR-211, JSR-226, JSR-229, JSR-234, JSR-238, JSR-239, JSR-248, JSR-256. You can see them all here.
These specifications have been interpreted differently by different companies implementing J2ME and they are often too generic to ensure the same piece of code to work identically on different phones.
Different mobile network operators also impose different requirements that sometime force mobile phone manufacturers to change the way their implementation of J2ME works based on who subsidises the handset.
Operators can also modify data that goes through their mobile network.