High-level wrapper of [jni
], making Java & Rust FFI easy & fun
toad_jni::global
offers the option to use a global JVM handle (toad_jni::global::jvm()
set with toad_jni::global::init()
).
Using the JVM global is completely optional, unless you plan to use Rust trait impls such as [IntoIterator
]
on toad_jni::java::util::ArrayList
.
All java type signatures can be represented by rust types
that implement the toad_jni::java::Type
trait, which is automatically
implemented for all toad_jni::java::Class
es.
Classes are represented in toad_jni
by implementing 2 traits:
* toad_jni::java::Class
* toad_jni::java::Object
(see also toad_jni::java::object_newtype
)
There are several high-level lens-style structs for interacting with fields, methods and constructors:
* toad_jni::java::Constructor
* toad_jni::java::StaticField
* toad_jni::java::StaticMethod
* toad_jni::java::Field
* toad_jni::java::Method
All of these types use toad_jni::java::Type
to transform nice Rust types into the corresponding
JVM type signatures.
For example, the StaticMethod
representation of java.lang.String.format(String, ..Object)
would be:
```rust
use toadjni::java::lang::Object;
use toadjni::java::StaticMethod;
static STRING_FORMAT: StaticMethod
It is recommended that these structs are stored in local static
variables so that they can cache
the internal JNI IDs of the class and methods, but this is not required.
Consider the following java class: ```java package com.foo.bar;
public class Foo { public final static long NUMBER = 123; public String bingus = "bingus";
public Foo() { }
public static String bar() { return "bar"; }
public void setBingus(String newBingus) { this.bingus = newBingus; } } ```
A Rust API to this class would look like: ```rust use toad_jni::java;
pub struct Foo(java::lang::Object);
java::object_newtype!(Foo);
impl java::Class for Foo { const PATH: &'static str = "com/foo/bar/Foo"; }
impl Foo {
pub fn new(e: &mut java::Env) -> Self {
static CTOR: java::Constructor pub fn number(e: &mut java::Env) -> i64 {
static NUMBER: java::StaticField pub fn bar(e: &mut java::Env) -> String {
static BAR: java::StaticMethod pub fn bingus(&self, e: &mut java::Env) -> String {
static BINGUS: java::Field pub fn setbingus(&self, e: &mut java::Env, s: String) {
static SETBINGUS: java::Method Licensed under either of at your option. Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the Apache-2.0
license, shall be dual licensed as above, without any additional terms or
conditions.License
Contribution