这是我的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加载
1条答案
按热度按时间m3eecexj1#
在执行JNI时,在Java文件上运行以下命令很有用:
字符串
这将创建一个
RustTest.h
文件,其中包含原生类的C接口,您必须在Rust中实现:让编译器为您考虑。现在,在这个文件中,你会看到你必须遵守的相关声明,但是在Rust中而不是C中:
型
首先要注意的是名称:函数不只是
get_name
,而是Java_
+ package_name + class_name + function_name 的串联。在您的特定情况下,package_name 不适用,function_name。我不确定
1
发生了什么,我认为get_
是属性或其他东西的保留前缀.现在是Rust代码,你也忘记了函数参数:
_env
:表示JVM。_obj
:是this
对象。不要忘记Java函数应该声明为
"system"
,而不是"C"
!型
现在应该能用了