The answer is this in my view:
Small embedded systems require small binaries written by cluefull people. The original Rockbox firmware binaries had to be less than 200K. Java is just not fast enough, not portable enough, wasn't free enough and isn't small and lean enough to be a good embedded choice for tiny devices. And there aren't many skilled java- programming people around in the embedded open source world.
C++ is not a good choice simply because several of us who started Rockbox just don't like C++ (nor java actually), and the fact that lots and lots of the 3rd party libs we use are plain C and we use them as unmodified as possible.
Java and C++ may have more hype and people who doesn't know things properly talk about them, but the way of C is the raw, fast, powerful and mighty way things get done in the embedded and open source world.