S60 is essentially a UI framework and a collection of middleware components on top of Symbian OS. Historically, Symbian provided the base operating system (e.g. kernel, communications, multimedia services, core application engines, reference UI) and device manufacturers added their own code on top of it to differentiate from competition and to optimize their devices for a particular purpose.
S60 is one of these add-ons, originally developed for phones intended for one-handed usage with a keypad. There have been others UI frameworks on top of Symbian OS as well, for example Nokia's Series 80 and Series 90, UIQ and MOAP(S).
Now as Symbian is moving to the Symbian Foundation mode of operation, S60 and Symbian OS are essentially merged into one Symbian Foundation platform. The other UI frameworks have been discontinued. But devices currently on the market still have the distinction between Symbian OS and S60.
- If I write applications in Symbian C++ or Java ME is it for the Symbian OS or the S60 platform?
- Can I directly write apps for the Symbian OS bypassing the S60 layer.
Depends on which APIs you use.
With Java ME it's easier to write applications that don't rely on S60-specific add-ons. In C++ it's likely that you want some UI for your app and therefore have to use the S60 Avkon UI. Though, if you want more platform-independent UI for your C++ app, have a look at Qt for S60.
In any case, writing C++ apps so that the same binary can be run on all Symbian OS based devices is practically not possible. In Java, "write once run everywhere" works in theory, but in practice it's more like "write once test everywhere and try to work around the differences between devices".