I found several other folks via a google search that experience the same problem. To summarize, the deviceReady function IS being called, it just is being called super-fast, before your handler is setup to respond to the event.
Here is how I fixed it for the spotmouth android app. I test for the presence of the navigator.device object. If it's not there, I register my callback. If there is already present, than the deviceReady event has already been called, and I just call it myself.
Html:
<body onload="onBodyLoad()">
</body>