We introduce a strategy for inlining native functions into JavaTM applications using a JIT compiler. We perform further optimizations to transform inlined callbacks into semantically equivalent lightweight operations. We show that this strategy can substantially reduce the overhead of performing JNI calls, while preserving the key safety and portability properties of the JNI. Our work leverages the ability to store statically-generated IL alongside native binaries, to facilitate native inlining at Java callsites at JIT compilation time. Preliminary results with our prototype implementation show speedups of up to 93X when inlining and callback transformation are combined. Categories and Subject Descriptors D.3.4 [Programming Languages]: Processors—compilers, optimization, run-time environments General Terms Languages, Performance, Design, Experimentation Keywords Java, JNI, inlining, JIT compilation, native code