Add ability to pass JSON args to backend

This commit is contained in:
Ethan O'Brien
2026-06-28 19:15:24 -05:00
parent 8d8b9dec9f
commit d4a6a56a27
3 changed files with 73 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
use jni::JNIEnv;
use jni::objects::{JClass};
use jni::sys::{jstring, jboolean};
use jni::sys::jstring;
use std::thread;
use std::sync::Once;
use jni::objects::JString;
@@ -43,14 +43,12 @@ fn android_init() {
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_startServer<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
data_path: JString<'local>,
easter: jboolean
config: JString<'local>,
) -> jstring {
android_init();
crate::runtime::set_easter_mode(easter != 0);
let data_path: String = env.get_string(&data_path).unwrap().into();
crate::runtime::update_data_path(&data_path);
let config: String = env.get_string(&config).unwrap().into();
crate::runtime::apply_config_json(&config);
let output = env.new_string(String::from("Azunyannnn~")).unwrap();
thread::spawn(|| {
@@ -70,7 +68,12 @@ extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_stopServer<'lo
#[unsafe(no_mangle)]
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_setEasterMode<'local>(_env: JNIEnv<'local>, _class: JClass<'local>, easter: jboolean) {
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_updateConfig<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
config: JString<'local>,
) {
android_init();
crate::runtime::set_easter_mode(easter != 0);
let config: String = env.get_string(&config).unwrap().into();
crate::runtime::apply_config_json(&config);
}

View File

@@ -76,5 +76,7 @@ pub struct Args {
}
pub fn get_args() -> Args {
Args::parse()
let mut args = Args::parse();
crate::runtime::overlay_args(&mut args);
args
}

View File

@@ -11,6 +11,18 @@ lazy_static! {
static ref MASTERDATA_WARNED: Mutex<HashSet<String>> = Mutex::new(HashSet::new());
static ref MOD_PATHS: RwLock<Vec<String>> = RwLock::new(Vec::new());
static ref EASTER: RwLock<bool> = RwLock::new(false);
static ref HOST_CONFIG: RwLock<HostConfig> = RwLock::new(HostConfig::default());
}
// This is used by an embedding app in lib mode
#[derive(Default, Clone)]
pub struct HostConfig {
pub assets_url: String,
pub npps4: String,
pub max_time: u64,
pub port: u16,
pub jp_android_asset_hash: String,
pub en_android_asset_hash: String,
}
pub fn set_running(running: bool) {
@@ -116,3 +128,50 @@ pub fn read_mod_files(rel_path: &str) -> Vec<(String, Vec<u8>)> {
}
out
}
pub fn apply_config_json(json: &str) {
let parsed = match jzon::parse(json) {
Ok(p) => p,
Err(e) => {
println!("Ignoring invalid host config json: {}", e);
return;
}
};
if let Some(v) = parsed["dataPath"].as_str() {
if !v.is_empty() {
update_data_path(v);
}
}
set_easter_mode(parsed["easterMode"].as_bool().unwrap_or(false));
let s = |key: &str| parsed[key].as_str().unwrap_or("").to_string();
let mut cfg = HOST_CONFIG.write().unwrap();
cfg.assets_url = s("assetsUrl");
cfg.npps4 = s("npps4");
cfg.max_time = parsed["maxTime"].as_u64().unwrap_or(0);
cfg.port = parsed["port"].as_u64().unwrap_or(0) as u16;
cfg.jp_android_asset_hash = s("jpAndroidAssetHash");
cfg.en_android_asset_hash = s("enAndroidAssetHash");
}
pub fn overlay_args(args: &mut crate::options::Args) {
let cfg = HOST_CONFIG.read().unwrap();
macro_rules! overlay_str {
($field:ident) => {
if !cfg.$field.is_empty() {
args.$field = cfg.$field.clone();
}
};
}
overlay_str!(assets_url);
overlay_str!(npps4);
if cfg.max_time != 0 {
args.max_time = cfg.max_time;
}
if cfg.port != 0 {
args.port = cfg.port;
}
overlay_str!(jp_android_asset_hash);
overlay_str!(en_android_asset_hash);
}