قابلیت همکاری با جاوا

جاوا می‌تواند objectهای مشترک را از طریق [واسط بومی جاوا Java Native Interface (JNI) بارگیری کند. jni crate به شما امکان می دهد یک کتابخانه سازگار ایجاد کنید.

ابتدا یک تابع Rust برای export به Java ایجاد می‌کنیم:

interoperability/java/src/lib.rs:

#![allow(unused)]
fn main() {
//! Rust <-> Java FFI demo.

use jni::objects::{JClass, JString};
use jni::sys::jstring;
use jni::JNIEnv;

/// HelloWorld::hello method implementation.
#[no_mangle]
pub extern "system" fn Java_HelloWorld_hello(
    env: JNIEnv,
    _class: JClass,
    name: JString,
) -> jstring {
    let input: String = env.get_string(name).unwrap().into();
    let greeting = format!("سلام, {input}!");
    let output = env.new_string(greeting).unwrap();
    output.into_inner()
}
}

interoperability/java/Android.bp:

rust_ffi_shared {
    name: "libhello_jni",
    crate_name: "hello_jni",
    srcs: ["src/lib.rs"],
    rustlibs: ["libjni"],
}

سپس این تابع را از جاوا فراخوانی می کنیم:

interoperability/java/HelloWorld.java:

class HelloWorld {
    private static native String hello(String name);

    static {
        System.loadLibrary("hello_jni");
    }

    public static void main(String[] args) {
        String output = HelloWorld.hello("الیس");
        System.out.println(output);
    }
}

interoperability/java/Android.bp:

java_binary {
    name: "helloworld_jni",
    srcs: [سلام دنیا"HelloWorld.java"],
    main_class: "HelloWorld",
    required: ["libhello_jni"],
}

در نهایت، می‌توانید باینری را بسازید، همگام‌سازی کنید و اجرا کنید:

m helloworld_jni
adb sync  # requires adb root && adb remount
adb shell /system/bin/helloworld_jni