From d15c9a73564a8bc88792b9634163cfe6f968d952 Mon Sep 17 00:00:00 2001 From: a Date: Sat, 28 Mar 2026 16:42:32 +0800 Subject: [PATCH] fix: fallback to StartNodeWithOptions when StartNode missing --- .../com/gomtm/android/swarm/SwarmRuntime.kt | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt b/app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt index 27dbca9..bb3e8f5 100644 --- a/app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt +++ b/app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt @@ -17,12 +17,34 @@ class SwarmRuntime( setStringProperty(configClass, configInstance, listOf("SetBootstrapAddr", "setBootstrapAddr"), config.bootstrapAddress) setStringProperty(configClass, configInstance, listOf("SetNodeName", "setNodeName"), config.nodeName) setBooleanProperty(configClass, configInstance, listOf("SetAutoReconnect", "setAutoReconnect"), config.autoReconnect) - invokeStaticByNames( - bridge = bridge, - methodNames = listOf("StartNode", "startNode"), - args = arrayOf(runtimeBaseDir(context), configInstance), - parameterTypes = arrayOf(String::class.java, configClass), - ) + val baseDir = runtimeBaseDir(context) + if (hasMethod(bridge, listOf("StartNode", "startNode"), arrayOf(String::class.java, configClass))) { + invokeStaticByNames( + bridge = bridge, + methodNames = listOf("StartNode", "startNode"), + args = arrayOf(baseDir, configInstance), + parameterTypes = arrayOf(String::class.java, configClass), + ) + return + } + + val booleanType = Boolean::class.javaPrimitiveType ?: Boolean::class.javaObjectType + if (hasMethod( + bridge, + listOf("StartNodeWithOptions", "startNodeWithOptions"), + arrayOf(String::class.java, String::class.java, String::class.java, booleanType), + ) + ) { + invokeStaticByNames( + bridge = bridge, + methodNames = listOf("StartNodeWithOptions", "startNodeWithOptions"), + args = arrayOf(baseDir, config.bootstrapAddress, config.nodeName, config.autoReconnect), + parameterTypes = arrayOf(String::class.java, String::class.java, String::class.java, booleanType), + ) + return + } + + throw IllegalStateException("bridge method not found: StartNode/StartNodeWithOptions") } fun stop() { @@ -85,6 +107,22 @@ class SwarmRuntime( return "" } + private fun hasMethod( + bridge: Class<*>, + methodNames: List, + parameterTypes: Array>, + ): Boolean { + for (name in methodNames) { + try { + bridge.getMethod(name, *parameterTypes) + return true + } catch (_: NoSuchMethodException) { + continue + } + } + return false + } + private fun invokeStaticByNames( bridge: Class<*>, methodNames: List,