2个版本

0.1.1 2023年7月5日
0.1.0 2022年7月30日

#396 in 异步

Download history 3292/week @ 2024-03-14 3056/week @ 2024-03-21 3446/week @ 2024-03-28 2863/week @ 2024-04-04 2838/week @ 2024-04-11 2865/week @ 2024-04-18 2751/week @ 2024-04-25 3042/week @ 2024-05-02 1697/week @ 2024-05-09 1754/week @ 2024-05-16 1673/week @ 2024-05-23 1890/week @ 2024-05-30 1535/week @ 2024-06-06 1639/week @ 2024-06-13 2191/week @ 2024-06-20 2141/week @ 2024-06-27

7,769 每月下载量
用于 33 个crate(直接使用3个)

BSD-3-Clause

140KB
3K SLoC

Rust 2.5K SLoC // 0.0% comments Java 266 SLoC // 0.5% comments Batch 78 SLoC

包含 (JAR文件,59KB) java/gradle/wrapper/gradle-wrapper.jar

Rust中JNI的额外实用工具

此crate基于jni crate构建,并提供了高级概念,以便更轻松地处理JNI。虽然 jni crate实现了JNI的低级绑定,但 jni-utils 更专注于常用的更高级构造。 jni-utils 提供的一些功能包括

  • 使用 JFutureJStream 类型对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