Java Native Interface Shortcomings High overheads Raw method invocation overhead Marshalling arguments, return values Expensive array copy between Java and C Native code is undesirable Can't verify it stays within the "sandbox" Native code is non-portable Native code is error-prone Strong separation between JVM and native methods Can only bind native code to method invocation No "native fields", "native operators", etc. Limits expressivity Too coarse-grained