首页 > 解决方案 > 更改静态字符串值

问题描述

我有一个静态可变值:

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"

效果很好。

标签: rust

解决方案


String功能完成后,您将被丢弃。因此,您不能将引用存储在static变量中:

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. 有几种方法可以获得全局堆分配变量,如此处所述。在您的情况下,您可以使用thread_local全局static变量并将字符串包装在 a 中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));
}

推荐阅读