# rust_java_samples **Repository Path**: hellyguo/rust_java_samples ## Basic Information - **Project Name**: rust_java_samples - **Description**: rust-java 样例 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-07-15 - **Last Updated**: 2024-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: sample, demo, Rust, Java ## README # rust-java 样例 [English version, 英文版](README.md) ## 简介 这个仓库包含调用 `Java` 方法的 `Rust` 代码,以及调用 `Rust` 方法的 `Java` 类。 ## 样例清单 0. **sample000**, 从 `Java` 调用 `Rust` 方法 - [s000_hello.rs](sample/src/samples/s000_hello.rs) - [HelloWorld.java](sample4j/src/main/java/sample/s000/HelloWorld.java) 1. **sample001**, 在 `Rust` 中将 `Java` 原始类型转换为字节 - [s001_bytes.rs](sample/src/samples/s001_bytes.rs) - [Bytes.java](sample4j/src/main/java/sample/s001/Bytes.java) 2. **sample002**, 在 `Rust` 中接受 `Java` 对象,并回调到 `Java` - [s002_callback.rs](sample/src/samples/s002_callback.rs) - [Caller.java](sample4j/src/main/java/sample/s002/Caller.java) - [s002_callback_fast.rs](sample/src/samples/s002_callback_fast.rs) - [Caller2.java](sample4j/src/main/java/sample/s002/Caller2.java) 3. **sample003**, 逆转 `Java` 字节 - [s003_reverse_bytes.rs](sample/src/samples/s003_reverse_bytes.rs) - [ReverseBytes.java](sample4j/src/main/java/sample/s003/ReverseBytes.java) 4. **sample004**, 在 `Rust` 中访问 `Java` 非堆内存 - [s004_direct_buf.rs](sample/src/samples/s004_direct_buf.rs) - [DirectBuf.java](sample4j/src/main/java/sample/s004/DirectBuf.java) 5. **sample005**, 在 `Rust` 中访问 `Java` 基本类型数组 - [s005_primitive_array.rs](sample/src/samples/s005_primitive_array.rs) - [PrimitiveArray.java](sample4j/src/main/java/sample/s005/PrimitiveArray.java) 6. **sample006**, 在 `Rust` 中创建 `Java` 对象 - [s006_create_object.rs](sample/src/samples/s006_create_object.rs) - [ObjectCreator.java](sample4j/src/main/java/sample/s006/ObjectCreator.java) 7. **sample007**, 在 `Rust` 中为 `Java` 对象设置字段值 - [s007_fill_field.rs](sample/src/samples/s007_fill_field.rs) - [FieldFiller.java](sample4j/src/main/java/sample/s007/FieldFiller.java) 8. **sample008**, 在 `Rust` 中加载 `Java` 类 - [s008_load_class.rs](sample/src/samples/s008_load_class.rs) - [s008_class_buf.rs](sample/src/samples/s008_class_buf.rs) - [MemClassLoader.java](sample4j/src/main/java/sample/s008/MemClassLoader.java) > `s008_class_buf.rs` 是通过 [java2u8vec.sh](shell/java2u8vec.sh) 生成的 9. **sample009**, 在 `Rust` 中动态注册 `Java` 方法 - [s009_reg_method.rs](sample/src/samples/s009_reg_method.rs) - [NativeMethodRegister.java](sample4j/src/main/java/sample/s009/NativeMethodRegister.java) [更多...](doc/sample_list_cn.md) ## 构建 ```shell cargo build --release ``` `cargo` 在 `target/release` 构建 `.so`, 并会调用 `build_java.sh` 构建 `.jar`,里面的 `resources` 文件夹会包含 `.so`。 ## 如何使用 1. 在 IDE 中调用 `Java` 单元测试 2. 在 IDE 中调用 `Java` 单元测试集 > **备注**:需要设置 `JVM` 参数: `-DsampleLib=` 或者 1. 在命令行中执行 `Java` 单元测试 ```shell gradle test --tests HelloWorldTest ``` 2. 在命令行中执行 `Java` 单元测试集 ```shell gradle test --tests SamplesSuite ``` 可在 [JUnit 报告](sample4j/build/reports/tests/test/index.html) 中观察结果 ## 感谢 感谢 [metaworm](https://github.com/metaworm)([rust-java-demo](https://github.com/metaworm/rust-java-demo))。当时我在学如何通过 `Rust` 调用 `JNI` 时,这篇文章 ([url1](https://zhuanlan.zhihu.com/p/568062165)/[url2](https://rustcc.cn/article?id=4ca84a67-d972-4460-912e-a297ec5edc0a)) 是最有效最详细的。