What problem does it solve? JNI has no compiler checking both sides of the boundary, so wrong method names, unguarded panics, unattached threads, and leaked local references fail only at run time on the device. This Skill provides the rules, templates, and triage tables to build and review Rust code that the JVM calls through JNI without run-time linkage failures or aborts. ## Core Features & Use Cases - Binding templates: RegisterNatives from JNI_OnLoad with the native_method! macro, plus #[jni_mangle] for name-based exports, with the exact panic-guard and error-policy patterns for jni 0.21 and 0.22. - Failure triage: Tables mapping UnsatisfiedLinkError, JNI DETECTED ERROR IN APPLICATION, local reference table overflow, and thread-detach aborts to their causes and fixes. - Threading and callbacks: Rules for attaching Rust-created threads, caching classes and method IDs in JNI_OnLoad, keeping env handles out of async tasks, and moving hot-path data via file descriptors or direct ByteBuffers. - Use Case: You are adding a native method to a Kotlin binding class backed by a Rust cdylib. Use this Skill to register it correctly, keep the JVM and Rust sides in one patch, and run the instrumentation checks that prove the binding. ## Quick Start Use the rust-jni skill to review my JNI_OnLoad and native method registrations for correctness against jni 0.22.