Eventually, especially when creating embedded systems, the time comes when a programmer must jump the gap between the Java world contained within the Java Virtual Machine (JVM) and the world of the low-level applications programming interface (API) through which hardware services are accessed. The Java Native Interface (JNI) is the preferred interface to non-Java routines, but its use is often seen as arcane and mysterious. This need not be the case; the JNI can be accessed through comparatively straightforward and effective techniques, which this paper will discuss, along with the reverse: how to access the JVM from outside the Java world.