From a3f54566d498af75d71fc33dca359f18c7c84953 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Thu, 9 Apr 2026 09:50:30 +0400 Subject: [PATCH] fix: call nativeSignalConnect from 8MB Java Thread, not Dispatchers.IO --- .../java/com/wzp/ui/call/CallViewModel.kt | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt b/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt index 220ab2f..75a7202 100644 --- a/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt +++ b/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt @@ -172,22 +172,26 @@ class CallViewModel : ViewModel(), WzpCallback { val seed = _seedHex.value val resolvedRelay = resolveToIp(relay) ?: relay - // nativeSignalConnect blocks up to 10s (waits for QUIC connect + register). - // Internal thread does the actual work; we just wait for the result. - viewModelScope.launch(kotlinx.coroutines.Dispatchers.IO) { + // nativeSignalConnect has JNI overhead — must be on a thread with enough stack. + // Dispatchers.IO threads overflow. Use explicit Java Thread. + Thread(null, { try { val mgr = com.wzp.engine.SignalManager() val ok = mgr.connect(resolvedRelay, seed) - if (ok) { - signalManager = mgr - startSignalPolling() - } else { - _errorMessage.value = "Failed to register on relay" + viewModelScope.launch { + if (ok) { + signalManager = mgr + startSignalPolling() + } else { + _errorMessage.value = "Failed to register on relay" + } } } catch (e: Exception) { - _errorMessage.value = "Register error: ${e.message}" + viewModelScope.launch { + _errorMessage.value = "Register error: ${e.message}" + } } - } + }, "wzp-signal-init", 8 * 1024 * 1024).start() } /** Poll signal manager state every 500ms */