6个版本
0.2.3 | 2022年5月3日 |
---|---|
0.2.2 | 2022年1月10日 |
0.2.1 | 2020年1月8日 |
0.1.6 | 2019年12月25日 |
0.0.1 |
|
#265 in 构建工具
用于 2 crates
53KB
802 行
jerk: Java Embedding Rust Kit
库,用于编译/嵌入/测试Java代码,同时与Rust库/应用程序一起使用。类似于 cc,但针对Java。这不是Google、Oracle、Sun Microsystems或任何其他官方项目的组成部分。
分支 | 徽章 | 备注 |
---|---|---|
发布 | 稳定/已发布版本 | |
master | "完成"但尚未发布的"东西"。 | |
wip/* | "工作进行中" - 不完整,使用时请自行承担风险。 | |
dead/* | 被遗弃的工作线程 |
目标
- 最小依赖
- 通过
javac
、jar
等在您的Rust代码之前/同时编译少量的Java代码。 - 待办事项: 通过
kotlinc
等在您的Rust代码之前/同时编译少量的Kotlin代码。 - 待办事项: 通过Ant、Groovy等在您的Rust代码之前/同时编译少量的JVM语言代码。
- 待办事项: 根据环境变量、常用路径等自动定位工具。
- 待办事项: 自动为您安装缺少的工具。
非目标
- 直接与Ant、Groovy等作为完整的Java构建工具竞争。
快速入门
如果您还没有安装,请安装JDK。
将以下内容添加到您的 Cargo.toml
[lib]
crate-type = ["rlib", "dylib"]
[dependencies]
jni-sys = "0.3"
[build-dependencies]
jerk = "0.2"
[dev-dependencies]
jerk = "0.2"
并将以下内容添加到您的 build.rs
fn main() {
jerk::metabuild();
}
然后您可以编写Java (src/Adder.java) 代码
package com.maulingmonkey.jerk.example_hello_world_jar;
public class Adder {
public native int add(int a, int b);
public static void test() {
System.loadLibrary("example_hello_world_jar");
assert adder.add(1, 2) == 3;
}
}
...与您的Rust (src/Adder.rs) 代码
use jni_sys::{JNIEnv, jobject, jint};
#[no_mangle] pub extern "stdcall" fn Java_com_maulingmonkey_jerk_example_1hello_1world_1jar_Adder_add__II(_env: *mut JNIEnv, _this: jobject, a: jint, b: jint) -> jint {
a + b
}
...并编写Java集成测试 (tests/test.rs)
#[test] fn test() {
jerk::run_test!("com.maulingmonkey.jerk.example_hello_world_jar", "Adder", "test");
}
...然后构建并运行测试!
C:\local\jerk>cargo t
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
Running target\debug\deps\example_hello_world_jar-2997df28c387b743.exe
running 1 tests
test adder::test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Java <-> Rust 互操作讨论
Rust代码可以合理地依赖Java代码进行构建,但反之则不行
- Java的ABI具有丰富的元数据(类、方法、文档信息等),而Rust甚至没有稳定的ABI。
- 在编译时,本地Java <- Rust <- Java的依赖循环将难以管理。
您仍然可以
- Java调用Rust,但应该通过在Java中声明的
native
方法来调用。 - 将Rust驱动的打包工具用于打包Java JAR(例如,在创建Android APK时)作为最终步骤。
- Rust定义实现接口的运行时类,它们在编译时对Java不可见。
许可
根据您的选择,许可如下
- Apache License,版本2.0(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0》)
- MIT许可(《LICENSE-MIT》或http://opensource.org/licenses/MIT》)
。
贡献
除非您明确声明,否则您提交的任何贡献,按照Apache-2.0许可证定义的,都应按上述方式双许可,不附加任何额外条款或条件。
依赖
~200KB