Even if the question states Java, most of the answers have digressed. So I thought I would do the same :)
We have been using Adobe AIR for the last 5 years and it is truly cross-platform and provides native-like performance with the same code base (at least 99% of our code is the same). Adobe AIR got some bad press at the beginning during the 'beta' period (slow, no GPU, Flash 'dead' etc.) But now, it's amazing what you can do with it. Not to mention the wealth of open source libs out there.
With the same code base you can push your app onto:
- iOS
- Android (x86 and ARM)
- Flash (still VERY useful)
- ChromeBook
- PC (as native with installer)
- Mac (as native with installer)
Why bother with Java or Objective-C ?
The only common platform not covered is Window Phone. But that's coming soon too.