2个版本
0.1.1 | 2021年9月12日 |
---|---|
0.1.0 | 2021年9月7日 |
#67 in #jni
在jnino中使用
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)
}
许可证
根据以下之一获得许可
- Apache许可证第2版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT),由您选择。
依赖项
~1.5MB
~36K SLoC