#jni #java #ffi #object

derive_jface

Rust本地对象到Java本地接口(derive)

2个版本

0.1.1 2021年9月12日
0.1.0 2021年9月7日

#67 in #jni


jnino中使用

MIT/Apache

4KB

此项目允许您将Rust对象用作JVM对象的一部分。

JVM

  • 添加返回Long和私有Long属性的本地构造函数

  • 将AutoCloseable作为本地方法实现

  • 添加终结器

  • 添加本地方法

class Sample extends AutoCloseable {
  @native private def nnew(): Long
  @native def close: Unit
  @native def test: Unit
  private val ptr = nnew()
  override def finalize = close
}
  • 使用try-with-resource(Java)/ Using(Scala)或隐式调用close()(不要依赖最终化——这是一条薄红线)

Rust

  • 将结构标记为JFace
#[derive(JFace)]
pub struct Sample {}
  • 使用throw(JNIEnv, default_function)将Rust Jr<> (Result<, Box>转换为默认JVM异常

  • 使用JFace::jni()转换为原始堆指针

  • 为JNI提供本地构造函数

#[no_mangle]
pub extern "system" fn Java_package_Sample_nnew(
  jenv: JNIEnv,
  _jclass: JClass,
) -> *mut Sample {
  Sample::new().jni().throw(jenv, null_mut)
}
  • 使用unit for Result<(), _>::throw()或hide for Result<T, _>::throw,对于不需要的T

  • 使用JFace::mut_raw和map/and_then进行本地方法

#[no_mangle]
pub extern "system" fn Java_org_apqm_jni_Sample_test(
  jenv: JNIEnv,
  jclass: JClass,
) {
  Sample::mut_raw(&jenv, jclass).map(|it| {
    todo!()
  }).throw(jenv, unit);
}
  • 使用JFace::box_raw进行析构函数
#[no_mangle]
pub extern "system" fn Java_org_apqm_jni_Sample_close(
  jenv: JNIEnv,
  jclass: JClass,
) {
  Sample::box_raw(&jenv, jclass).map(hide).throw(jenv, unit)
}

许可证

根据以下之一获得许可

依赖项

~1.5MB
~36K SLoC