从 Java 调用 Rust
我正在使用 Rust 1.0 beta,并且能够创建一个小示例来调用从 Java 用 Rust 编写的函数。我只是在 mylib.rs 中使用rustc编译了以下Rust代码,rustc在Windows上生成了mylib.dll:
#![crate_type = "dylib"]
use std::any::Any;
#[no_mangle]
pub extern fn Java_tests_Test_hello(env: *const Any, jclass: *const Any) {
    println!("hello from rust");
}
#[no_mangle]
pub extern fn Java_tests_Test_sum(env: *const Any, jclass: *const Any, a: i32, b: i32) -> i32 {
    return a + b;
}
然后,我可以从 Java 类测试中调用这些函数。测试:
package tests;
import java.io.File;
public class Test {
    public static native void hello();
    public static native int sum(int a, int b);
    public static void main(String[] args) {
        File f = new File("mylib.dll");
        System.load(f.getAbsolutePath());
        Test.hello();
        System.out.println(Test.sum(20, 22));
    }
}
运行 Java 主将打印预期的结果:
hello from rust
42
在 Rust 方法中,我声明为指向该类型的指针,但实际上它是一个 C 结构,其中包含指向文档(代码示例 4-1)中描述的函数的指针,这些函数是与 Java 运行时交换数据所必需的。envAny
从这个答案中,我明白了这种带有函数指针的结构在 Rust 代码中应该有一个对应项来调用这些函数。因此,我试图实现这样的结构,将所有字段值设置为除字段之外:*mut AnyGetVersion
#[repr(C)]
pub struct JavaEnv {
    reserved0: *mut Any,
    reserved1: *mut Any,
    reserved2: *mut Any,
    reserved3: *mut Any,
    GetVersion: extern "C" fn(env: *mut JavaEnv) -> i32,
    DefineClass: *mut Any,
    FindClass: *mut Any,  
    …
当我从Java调用以下函数时,它应该调用GetVersion函数,JVM崩溃了:
#[no_mangle]
pub extern fn Java_tests_Test_helloJre(jre: *mut JavaEnv, class: *const Any) {
    unsafe {
        let v = ((*jre).GetVersion)(jre);
        println!("version: {:?}", v);
    }
}
我应该如何正确调用 GetVersion 函数?请注意,我对这种东西真的很陌生,所以如果需要,请随时编辑这个问题。
 
					 
				 
				    		 
				    		 
				    		 
				    		