From 0b821585ab852d28ce173f7f8f817ee71d537fc3 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Thu, 9 Apr 2026 08:10:22 +0400 Subject: [PATCH] fix: call nativeStartSignaling from Java Thread with 8MB stack, not Kotlin IO dispatcher --- .../java/com/wzp/ui/call/CallViewModel.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 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 eb183f3..ba27921 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 @@ -171,16 +171,20 @@ class CallViewModel : ViewModel(), WzpCallback { val seed = _seedHex.value val alias = _alias.value - viewModelScope.launch(Dispatchers.IO) { - val resolvedRelay = resolveToIp(relay) ?: relay + // Use a Java Thread with 8MB stack — Kotlin's IO dispatcher threads are too small + // for the native JNI + Rust + TLS stack requirements + val resolvedRelay = resolveToIp(relay) ?: relay + Thread(null, { val result = engine?.startSignaling(resolvedRelay, seed, "", alias) - if (result == 0) { - _signalState.value = 5 // Registered - startStatsPolling() - } else { - _errorMessage.value = "Failed to register on relay" + viewModelScope.launch { + if (result == 0) { + _signalState.value = 5 // Registered + startStatsPolling() + } else { + _errorMessage.value = "Failed to register on relay" + } } - } + }, "wzp-register", 8 * 1024 * 1024).start() } /** Place a direct call to the target fingerprint */