如何编译Rust代码,使其函数可以通过Java调用

c90pui9n  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(65)

这是我的Rust代码

#[no_mangle]
 pub extern "C" fn get_name(){
    println!("subham shaw");
}

字符串
这是我的java代码

// ExampleJNI.java

public class RustTest {
    static {
       
        // Load the Rust library
        System.load("E:/Rust_pro/android_test/target/debug/sample.dll"); 
    }

    // Native method declarations
    public native void get_name();
    
    public static void main(String[] args) {
        RustTest example = new RustTest();

        example.get_name();
        
       
    }
}


这是我货物,汤姆

[package]
name = "android_test"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
jni = "0.21.1"

[lib]
name = "sample"
crate-type = ["cdylib"]


我试过这个代码,但它不工作,java抛出错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: 'void RustTest.get_name()'
        at RustTest.get_name(Native Method)
        at RustTest.main(RustTest.java:16)


如何解决这个问题
我试图导出rust函数,以便它可以使用java加载

m3eecexj

m3eecexj1#

在执行JNI时,在Java文件上运行以下命令很有用:

javac -h . RustTest.java

字符串
这将创建一个RustTest.h文件,其中包含原生类的C接口,您必须在Rust中实现:让编译器为您考虑。
现在,在这个文件中,你会看到你必须遵守的相关声明,但是在Rust中而不是C中:

JNIEXPORT void JNICALL Java_RustTest_get_1name
  (JNIEnv *, jobject);


首先要注意的是名称:函数不只是get_name,而是Java_ + package_name + class_name + function_name 的串联。
在您的特定情况下,package_name 不适用,function_name。我不确定1发生了什么,我认为get_是属性或其他东西的保留前缀.
现在是Rust代码,你也忘记了函数参数:

  • _env:表示JVM。
  • _obj:是this对象。

不要忘记Java函数应该声明为"system",而不是"C"

use jni::JNIEnv;
use jni::objects::JObject;

#[no_mangle]
pub extern "system" fn Java_RustTest_get_1name(_env: JNIEnv, _obj: JObject){
    println!("subham shaw");
}


现在应该能用了

相关问题