RMI is indeed for distributed programming, but JNI is for linking non-Java libraries into Java programs, and has nothing to do with distributed programming.
Jini is more of a distributed architecture rather than simply more of an API for doing distributed programming like RMI. In fact, Jini is implemented using RMI.
I would recommend learning RMI first, because you won't get very far in Jini without understanding RMI anyway.
JNDI stands for Java Naming and Directory Interface. It basically provides a way to look up distributed programs and resources using a file system or URL like structure - i.e. "names" point to a specific resource, "directories" can hold other directories or a set of names.
-Nate
Write once, run anywhere, because there's nowhere to hide! - /. A.C.