RMI allows objects in one Java Virtual Machine (JVM) to invoke methods on objects residing in another JVM. It uses stub and skeleton objects to enable remote communication between Java programs. The stub on the client side sends a call to the server-side skeleton, which then invokes the actual remote object. The key steps to build an RMI application are: defining the remote interface, implementing it, generating stub and skeleton objects, starting the RMI registry, running the server, and making calls from the client.