Ok, I'm pondering this one a bit. We can certainly use the native calls, but they'll only work where native is supported, which may not include some deployment scenarios. So a non-native option is needed as well.
It turns out Java 5+ has such a feature in its management capabilities:
However, it's provided at thread granularity, so we can get the amount of CPU time any one thread has consumed, but not easily get a full process CPU time. Obviously we could just get a list of all threads and tally them up ourselves. Does that seem right?
Anyone interested in this, please have a look at the javadocs and offer up an opinion...