At least in me experience, it's quite difficult to compare C++ to Java because they follow rather different patterns. Nearly the only way to compare them in a meaningful fashion is to graph code complexity vs., program "size" for both:
Black line = C++, Red line = Java.
Especially if you look primarily at really small projects, C++ can seem nearly impossible -- adding even a few features is a lot of work and adds a great deal of complexity to the code. This is (particularly) at a phase where nearly everything you do means finding, building, learning, etc., another library that's typically independent of the others.
For projects of this size, Java is often considerably more attractive -- it comes with a much larger standard library that (mostly) follows roughly a similar style, so what you know about one part extends reasonably well to other parts. You also get things like garbage collection, so your memory management tends to be relatively trivial.
For larger projects, the situation reverses -- the operator overloading that made some of the libraries hard to learn also makes them easier to use, once you know how. Likewise, the templates that were really hard to wrap your head around, let you solve a much wider range of problems without using new code. Instead of garbage collection to make memory management easy, you learn to apply RAII to make manage of virtually all resources easy.
Unfortunately, it's often pretty hard to estimate where any particular project lies on the horizontal axis. Worse, unless it's really close to the cross-over point, the difference between the two isn't usually something like 10 or 15% -- it's more likely to be on the order of 2:1 or 3:1. In many cases, the choice is the difference between a great success, and a horrible failure.
That said, I think most of your assessments are largely wrong.
Portability: just about even across the board. Not nearly as hard with C or C++ as most people believe, nor (unfortunately) nearly as easy with Java as they believe.
GUIs: Java makes GUIs easy -- and ugly and unresponsive. Qt (for one example) has about the same portability, only slightly more work, but much nicer results.
Speed: only rarely a reason to choose one over the other. Yes, C++ will usually win, but it won't make any real difference for most applications.
As far as C goes, yes, it's useful for smaller embedded systems. Its primary advantage is that it minimizes the environmental framework necessary to get a working system. C++ takes quite a bit more, and Java substantially more again (though this can be irrelevant if that environment is already guaranteed to be present, such as Java on many mobile phones).