diff --git a/tests/test_android_bridge.c b/tests/test_android_bridge.c index 70c29908..83e39846 100644 --- a/tests/test_android_bridge.c +++ b/tests/test_android_bridge.c @@ -77,11 +77,11 @@ static int check_bridge_config(void) { REQUIRE(utun_bridge_init(NULL, 0, NULL, NULL, &config)); REQUIRE(cfg_get_int(CFG_KEY_CONTROL_PORT, -1) == 4321); REQUIRE(cfg_get_string(CFG_KEY_NODE_NAME, NULL) == NULL && cfg_get_int64("wide", 789) == 789); - utun_bridge_destroy(); + REQUIRE(!utun_bridge_destroy()); REQUIRE(cfg_get_int(CFG_KEY_CONTROL_PORT, 9999) == 9999); REQUIRE(utun_bridge_init(NULL, 0, NULL, NULL, NULL)); REQUIRE(cfg_get_int(CFG_KEY_CONTROL_PORT, 9998) == 9998); - utun_bridge_destroy(); + REQUIRE(!utun_bridge_destroy()); printf("[PASS] bridge config: init, replacement, destroy and reinit\n"); return 0; } diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index cff9b496..e9a083b2 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -166,15 +166,16 @@ bool utun_bridge_init(const char* db_path, int control_port, return true; } -void utun_bridge_destroy(void) { +int utun_bridge_destroy(void) { + if (instance_lite_stop()) { bridge_log(BLEV_ERROR, "bridge destroy refused: worker is not joined"); return -1; } voice_recorder_deinit(); - instance_lite_stop(); utun_config_set_provider(NULL); g_on_log = NULL; g_cfg_string = NULL; g_cfg_int64 = NULL; g_cfg_int = NULL; bridge_log(BLEV_INFO, "bridge destroy"); + return 0; } /* Удалять только после остановки ядра: отсутствие файла нормально, остальные ошибки не скрывать. */ diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.h b/tools/chatgui-android/jni_bridge/android_jni_bridge.h index 47887202..ea724402 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.h +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.h @@ -59,11 +59,12 @@ int utun_bridge_start(const char* config_text); * При частичном отказе проверяет остальные файлы; каждую ошибку и итоговые счётчики пишет в лог. */ int utun_bridge_clear_database(const char* db_path); -/* Освободить recorder, вызвать instance_lite_stop и снять C log/config callbacks. +/* Полностью остановить/join worker, освободить recorder и снять C log/config callbacks. * Config-provider сбрасывается к defaults; повторный init начинает новую регистрацию. - * Перед вызовом остановить внешние media workers/DSP; ограничения ожидания — instance_lite.h. + * Перед вызовом остановить внешние media workers/DSP, ждать вне UI; контракт ожидания — instance_lite.h. + * 0 — очистка завершена; -1 — stop/join отклонён, recorder и callbacks сохранены, новый init запрещён. * JNI nativeStop дополнительно останавливает UDP-лог, nativeDestroy освобождает JNI global refs. */ -void utun_bridge_destroy(void); +int utun_bridge_destroy(void); /* ── Actions (Kotlin → C) ── */