duchess 0.3.3

Silky smooth Java-Rust interop
# Tutorial: implementing native methods

**WARNING:** This support is not yet implemented.

Duchess also supports implementing Java native methods, making it easy to call Rust code from Java.

## Setup

Be sure to follow the [setup instructions](./setup.md).

## Example

Given a Java class

```java
package me.ferris;

public class ClassWithNativeMethod {
    int data() { return 22; }
    native String compute(Object o);
}
```

you can provide an implementation for `compute` like so:

```rust,ignore
// First, reflect the class, as described in the "calling Java from Rust" tutorial:
duchess::java_package! {
    package me.ferris;
    class ClassWithNativeMethod { * }
}

use duchess::{java, IntoJava};
use me::ferris::ClassWithNativeMethod;

// Next, provide a decorated Rust function.
// The arguments are translated from Java, including the `this`.
// The return type is either a scalar or `impl IntoJava<J>`
// where `J` is the Java type.
#[duchess::native(me.ferris.ClassWithNativeMethod::compute)]
fn compute(
    this: &ClassWithNativeMethod,
    object: &java::lang::Object,
) -> impl IntoJava<java::lang::String> {
    // in here you can call back to JVM too
    let data = this.data().execute();
    format!("Hello from Rust {data}")
}
```