2个版本
0.1.1 | 2023年7月5日 |
---|---|
0.1.0 | 2022年7月30日 |
#396 in 异步
7,769 每月下载量
用于 33 个crate(直接使用3个)
140KB
3K SLoC
包含 (JAR文件,59KB) java/gradle/wrapper/gradle-wrapper.jar
Rust中JNI的额外实用工具
此crate基于jni
crate构建,并提供了高级概念,以便更轻松地处理JNI。虽然 jni
crate实现了JNI的低级绑定,但 jni-utils
更专注于常用的更高级构造。 jni-utils
提供的一些功能包括
- 使用
JFuture
和JStream
类型对Java代码进行异步调用 - 各种常用Rust类型及其对应Java类型之间的转换
- 使用
try_block
函数模拟try/
catch
块
jni-utils
的主要原则是将Rust和Java代码之间的切换最小化,并且从Rust调用Java代码比从Java调用Rust代码更容易。从Java调用Rust需要创建一个包含 native
方法的类,并从Rust中导出它,可以通过组合 #[nomangle]
和 extern "C"
将函数导出为共享库中的符号,或者通过调用 JNIEnv::register_native_methods()
。相比之下,从Rust调用Java只需要调用 JNIEnv::call_method()
(尽管您可以通过缓存方法ID并使用 JNIEnv::call_method_unchecked()
来提高性能。)
为此,jni-utils
旨在最小化必须穿透Rust-Java边界的孔洞数量,以及必须编写的导出到Java的native
Rust函数数量。特别是,已经开发了一个异步API,通过允许Java代码唤醒一个await
而不创建一个新的native
函数来最小化这种导出。
jni-utils
的一些功能需要配套的Java支持库,该库包含一些本地方法。因此,在使用jni-utils
之前应先调用jni_utils::init()
。
库历史与说明
尽管我现在正在维护这个库(qDot/Kyle Machulis),但这个库的大部分原始作者是gedgygedgy。原始仓库位于https://github.com/gedgygedgy/jni-utils-rs。作者于2021年8月消失了,我无法与他们取得联系。尽管如此,他们在btleplug和其他项目上所做的工作大部分已经完成,许可证足够宽容,可以重新分发,所以我接管了维护权,试图将其推向世界。
我绝对不是JNI专家(尽管感谢更新以支持Tokio,我现在知道的比以前多得多。或者我想要的。)所以,虽然我很乐意尝试接受PR并修复错误,但我不能承诺太多。
构建
可以一起或单独构建crate和Java支持库。
简单方式
crate包含一个功能,可以自动构建Java支持库
$ cargo build --features=build-java-support
Java支持库JAR将放置在target/<config>/java/libs
。
高级方式
可以单独构建crate和Java支持库
$ cargo build
$ cd java
$ ./gradlew build
使用
您的Rust crate需要链接到jni-utils
crate,并且您的Java程序需要对Java支持库有一个implementation
依赖。将此添加到您的build.gradle
dependencies {
implementation 'io.github.gedgygedgy.rust:jni-utils:0.1.0'
}
与Tokio一起使用
这个库应该不需要更改即可与Tokio异步运行时一起工作。然而,当向这个crate添加任何新功能时,它们需要包含在类缓存中,因为创建新的线程在tokio中似乎存在类缓存未更新的问题。
依赖项
~3–9.5MB
~86K SLoC