[Scummvm-git-logs] scummvm master -> d0ac1845e3a9e6c8a2e3b74f9e047199cf607d1b

lephilousophe noreply at scummvm.org
Mon Feb 2 22:09:10 UTC 2026


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
d0ac1845e3 ANDROID: initialize JNI network classes at startup


Commit: d0ac1845e3a9e6c8a2e3b74f9e047199cf607d1b
    https://github.com/scummvm/scummvm/commit/d0ac1845e3a9e6c8a2e3b74f9e047199cf607d1b
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2026-02-02T23:07:31+01:00

Commit Message:
ANDROID: initialize JNI network classes at startup

The ClassLoader doesn't support to be called from a native thread like
the timer.
Cloud uses the timer to initiate network requests which causes a crash.

Changed paths:
    backends/networking/basic/android/jni.cpp
    backends/networking/basic/android/jni.h
    backends/networking/basic/android/socket.cpp
    backends/networking/basic/android/url.cpp
    backends/networking/http/android/connectionmanager-android.cpp
    backends/platform/android/jni-android.cpp


diff --git a/backends/networking/basic/android/jni.cpp b/backends/networking/basic/android/jni.cpp
index a0d44b62607..361abec64bc 100644
--- a/backends/networking/basic/android/jni.cpp
+++ b/backends/networking/basic/android/jni.cpp
@@ -63,6 +63,8 @@ jmethodID NetJNI::_MID_socket_recv = 0;
 jmethodID NetJNI::_MID_socket_close = 0;
 
 #ifdef USE_HTTP
+jclass NetJNI::_CLS_HTTPManager = nullptr;
+
 jmethodID NetJNI::_MID_manager_init = 0;
 jmethodID NetJNI::_MID_manager_startRequest = 0;
 jmethodID NetJNI::_MID_manager_poll = 0;
@@ -139,6 +141,7 @@ void NetJNI::init(JNIEnv *env) {
 
 #ifdef USE_HTTP
 	cls = env->FindClass("org/scummvm/scummvm/net/HTTPManager");
+	_CLS_HTTPManager = (jclass)env->NewGlobalRef(cls);
 
 	FIND_CONSTRUCTOR(manager_, "()");
 	FIND_METHOD(manager_, startRequest, "(Lorg/scummvm/scummvm/net/HTTPRequest;)V");
diff --git a/backends/networking/basic/android/jni.h b/backends/networking/basic/android/jni.h
index 8358341bfe7..59b8a8bf031 100644
--- a/backends/networking/basic/android/jni.h
+++ b/backends/networking/basic/android/jni.h
@@ -55,6 +55,8 @@ private:
 	static jmethodID _MID_socket_close;
 
 #ifdef USE_HTTP
+	static jclass    _CLS_HTTPManager;
+
 	static jmethodID _MID_manager_init;
 	static jmethodID _MID_manager_startRequest;
 	static jmethodID _MID_manager_poll;
diff --git a/backends/networking/basic/android/socket.cpp b/backends/networking/basic/android/socket.cpp
index 53f1cd44dcf..4467a45cd6b 100644
--- a/backends/networking/basic/android/socket.cpp
+++ b/backends/networking/basic/android/socket.cpp
@@ -55,7 +55,6 @@ Socket *Socket::connect(const Common::String &url) {
 
 Socket *AndroidSocket::connect(const Common::String &url) {
 	JNIEnv *env = JNI::getEnv();
-	NetJNI::init(env);
 
 	jstring url_obj = env->NewStringUTF(url.c_str());
 	jobject socket_obj = env->NewObject(NetJNI::_CLS_Socket, NetJNI::_MID_socket_init, url_obj);
diff --git a/backends/networking/basic/android/url.cpp b/backends/networking/basic/android/url.cpp
index 92ac010cf4b..16258d9abcb 100644
--- a/backends/networking/basic/android/url.cpp
+++ b/backends/networking/basic/android/url.cpp
@@ -55,7 +55,6 @@ URL *URL::parseURL(const Common::String &url) {
 
 URL *AndroidURL::parseURL(const Common::String &url) {
 	JNIEnv *env = JNI::getEnv();
-	NetJNI::init(env);
 
 	jstring url_sobj = env->NewStringUTF(url.c_str());
 	jobject url_obj = env->NewObject(NetJNI::_CLS_URL, NetJNI::_MID_url_init, url_sobj);
diff --git a/backends/networking/http/android/connectionmanager-android.cpp b/backends/networking/http/android/connectionmanager-android.cpp
index fbef9672b5b..0ed18115900 100644
--- a/backends/networking/http/android/connectionmanager-android.cpp
+++ b/backends/networking/http/android/connectionmanager-android.cpp
@@ -60,11 +60,7 @@ namespace Networking {
 ConnectionManagerAndroid::ConnectionManagerAndroid() : ConnectionManager(), _manager(0) {
 	JNIEnv *env = JNI::getEnv();
 
-	NetJNI::init(env);
-
-	// As we are called once, don't bother storing a global reference in JNI init
-	jclass cls = env->FindClass("org/scummvm/scummvm/net/HTTPManager");
-	jobject obj = env->NewObject(cls, NetJNI::_MID_manager_init);
+	jobject obj = env->NewObject(NetJNI::_CLS_HTTPManager, NetJNI::_MID_manager_init);
 	if (env->ExceptionCheck()) {
 		LOGE("HTTPManager::<init> failed");
 		env->ExceptionDescribe();
diff --git a/backends/platform/android/jni-android.cpp b/backends/platform/android/jni-android.cpp
index 86fc6c8f128..9647ea74dc6 100644
--- a/backends/platform/android/jni-android.cpp
+++ b/backends/platform/android/jni-android.cpp
@@ -43,6 +43,8 @@
 #include "backends/platform/android/jni-android.h"
 #include "backends/platform/android/asset-archive.h"
 
+#include "backends/networking/basic/android/jni.h"
+
 #include "base/main.h"
 #include "base/version.h"
 #include "common/config-manager.h"
@@ -815,6 +817,11 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager,
 
 	assets_updated = assets_updated_;
 
+	// Initialize network bindings here in a Java thread
+	// If net called gets called for the first time in a timer thread,
+	// the class loader is lost and can't find our classes.
+	Networking::NetJNI::init(env);
+
 	pause = false;
 	// initial value of zero!
 	sem_init(&pause_sem, 0, 0);




More information about the Scummvm-git-logs mailing list