我有一个静态可变值:
static mut ADDRESS: &'static str = "";
它是全局的,不在任何函数中。
现在我有一个问题:
我有读取此值的函数,它们工作正常,但是当我尝试创建从参数更改此值的函数时 - 它开始提示该值“活得不够长”。
#[no_mangle]
pub unsafe extern fn Java_Rust_setAddress(
env: JNIEnv,
_: JClass,
address: JString
) {
let input: String = env.get_string(address).expect("Couldn't get java string!").into();
ADDRESS = &input /Error there/
}
我可以用它做什么?在每种情况下传输地址都不是一个变体,我确实需要一个简单的全局变量。
ADDRESS = input.as_str()
也不起作用。
但是
ADDRESS = "Something"
效果很好。
最佳答案
函数完成后,您的String
将被删除。因此,您不能将引用存储在静态
变量中:
ADDRESS = &input;
// ^^^^^^ input does not live long enough
// ADDRESS requires that `input` is borrowed for `'static`
}
// < `input` dropped here while still borrowed by ADDRESS
相反,您需要存储全局堆分配的String
。有几种方法可以拥有全局堆分配变量 as explained here 。在您的情况下,您可以使用 thread_local
全局 static
变量并将字符串包装在 Cell
中,这提供了可变性:
use std::cell::Cell;
thread_local!(static ADDRESS: Cell<String> = Cell::new("".to_string()));
#[no_mangle]
pub unsafe extern fn Java_Rust_setAddress(
env: JNIEnv,
_: JClass,
address: JString
) {
let input: String = env.get_string(address).expect("Couldn't get java string!").into();
ADDRESS.with(|address| address.set(input));
}
关于rust - 更改静态字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65266850/