Skip to content

[android] Don't crash the app if native client fails to init#10

Merged
Imperiopolis merged 1 commit into
juicebox-systems:mainfrom
edenman:main
Mar 7, 2026
Merged

[android] Don't crash the app if native client fails to init#10
Imperiopolis merged 1 commit into
juicebox-systems:mainfrom
edenman:main

Conversation

@edenman

@edenman edenman commented Nov 25, 2025

Copy link
Copy Markdown
Contributor

In our app we are wrapping the calls to the juicebox SDK in a try/catch but we are still getting occasional crashes (stacktrace below). This PR adds a try/catch around both of the launched threads to ensure that the app does not crash if Client init fails, and adds an optional callback so callers get notified if the init failed.

Fatal Exception: java.net.NoRouteToHostException: Host unreachable
       at libcore.io.IoBridge.connect(IoBridge.java:182)
       at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
       at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
       at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
       at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
       at java.net.Socket.connect(Socket.java:646)
       at com.android.okhttp.internal.Platform.connectSocket(Platform.java:182)
       at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:145)
       at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
       at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
       at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
       at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
       at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
       at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
       at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
       at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
       at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
       at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219)
       at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30)
       at com.google.firebase.perf.network.InstrURLConnectionBase.getOutputStream(InstrURLConnectionBase.java:165)
       at com.google.firebase.perf.network.InstrHttpsURLConnection.getOutputStream(InstrHttpsURLConnection.java:89)
       at xyz.juicebox.sdk.Client$Companion$createNative$httpSend$1$1.invoke(Client.kt:163)
       at xyz.juicebox.sdk.Client$Companion$createNative$httpSend$1$1.invoke(Client.kt:125)
       at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)

Fixes #11

@edenman

edenman commented Feb 12, 2026

Copy link
Copy Markdown
Contributor Author

@Imperiopolis can you take a look please?

Comment thread android/src/main/kotlin/xyz/juicebox/sdk/Client.kt Outdated
Comment thread android/src/main/kotlin/xyz/juicebox/sdk/Client.kt Outdated
Comment thread android/gradle/wrapper/gradle-wrapper.properties Outdated
In our app we are wrapping the calls to the juicebox SDK in a try/catch
but we are still getting occasional crashes (stacktrace below).  This PR
adds a try/catch around both of the launched threads to ensure that the
app does not crash if Client init fails, and adds an optional callback
so callers get notified if the init failed.

```
          Fatal Exception: java.net.NoRouteToHostException: Host unreachable
       at libcore.io.IoBridge.connect(IoBridge.java:182)
       at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
       at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
       at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
       at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
       at java.net.Socket.connect(Socket.java:646)
       at com.android.okhttp.internal.Platform.connectSocket(Platform.java:182)
       at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:145)
       at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
       at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
       at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
       at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
       at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
       at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
       at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
       at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
       at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
       at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219)
       at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30)
       at com.google.firebase.perf.network.InstrURLConnectionBase.getOutputStream(InstrURLConnectionBase.java:165)
       at com.google.firebase.perf.network.InstrHttpsURLConnection.getOutputStream(InstrHttpsURLConnection.java:89)
       at xyz.juicebox.sdk.Client$Companion$createNative$httpSend$1$1.invoke(Client.kt:163)
       at xyz.juicebox.sdk.Client$Companion$createNative$httpSend$1$1.invoke(Client.kt:125)
       at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
```
@edenman

edenman commented Mar 4, 2026

Copy link
Copy Markdown
Contributor Author

Updated, thanks!

@Imperiopolis Imperiopolis merged commit 03d028d into juicebox-systems:main Mar 7, 2026
0 of 18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Android Crash on SocketException

2 participants