Jni Rs Bindings

jni-rs conventions for exposing a Rust core to Java/JVM: JNI export naming, JNIEnv usage, string conversion, exception checks/throws, global references, and library loading. Load when generating or reviewing jni-rs Java/JVM bindings for a Rust library.

goldziher Updated

File contents

  • Use jni crate for Rust-Java/JVM interop. Functions must be #[no_mangle] pub extern "system".
  • Follow JNI naming: Java_com_example_ClassName_methodName. Match Java native method signatures exactly.
  • Use JNIEnv for all JNI operations. Access Java types via JObject, JString, JClass wrappers.
  • String conversion: env.get_string(&jstring) to read, env.new_string("value") to create.
  • Error handling: check env.exception_check() after JNI calls. Throw Java exceptions via env.throw_new().
  • Global references (env.new_global_ref()) for objects accessed across threads or native calls.
  • Build with cargo build --release to produce shared library. Load in Java with System.loadLibrary().
  • Test Java side with JUnit, Rust core logic with standard #[test]. Integration tests via JNI calls.
  • Keep JNI layer thin — business logic in Rust, Java provides API surface.
  • Memory: JNI local references are auto-freed on native return. Use env.delete_local_ref() in loops.
  • Anti-patterns: holding JNI references across threads without global refs, ignoring exception checks, unwrap() in JNI functions.

goldziher/ai-rulez/tree/main/internal/builtins/bindings/jni-rs/skills/jni-rs-bindings commit 9b8b52ed34

Frequently asked questions

npx skillmds@latest add goldziher/jni-rs-bindings