I'm told it's gotten a lot better in Java land, but back in the early days invoking native code was quite a pain. There were whole books available on how to deal with this dark art.
The main thing, though, was simply attitude. Sun's attitude was that Java was a separate platform. You write for Java. It is an inconvenient truth that any given instance of Java happens to be running on Windows, or Linux, or Mac, or whatever--don't worry about that and you just stick to the Java platform. If you wanted to have a native interface with Java computations code, you were thinking heretical thoughts. So, Java came with AWT and Swing. It would have been inconceivable for Sun to include a GUI meant just for Windows, and one meant just for Mac, and so on.
You want to do that in Mono. They are fine with that. They include a GUI interface for Mac that only works on Mac. They include a WinForms interface for developing Windows native stuff (although they do somewhat support it on non-Windows so people can use it to port Windows stuff).
The Mono developer's attitude seems to be more toward providing useful tools to programmers, so we can do what we want, rather than trying to provide a platform that we should leave our native platforms for.
To put it succinctly, if you said "I want to write a Windows program" or "I want to write a Mac program", Sun would have said "Write a Java program instead!". The Mono people say "Cool. We've got some neat tools you can use for that!".
Also the difference between using .NET's P/Invoke (DllImport) interface versus Java's JNI is about as big as can be in terms of developer pain and overhead.
Have a look at JNA. It's about as easy to use as P/Invoke.
Of course Java's days on the desktop are kind of numbered with the various browser and OS vendors getting visibly concerned about the security of the JRE, but that's a different matter.
Unfortunately it's still a huge pain to use JNA with stuff that returns unions (or a pointer to different type depending on the usage context). That makes things like X libraries wrappers really difficult to write in a clean way.
Care to explain the last bit ? Because Java also lets you invoke native code (and hence platform specific) if you want to.