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 bb3e8f5..0d82672 100644 --- a/app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt +++ b/app/src/main/java/com/gomtm/android/swarm/SwarmRuntime.kt @@ -28,20 +28,21 @@ class SwarmRuntime( 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 + for (booleanType in booleanParameterTypes()) { + 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") @@ -160,20 +161,27 @@ class SwarmRuntime( } private fun setBooleanProperty(targetClass: Class<*>, target: Any, methodNames: List, value: Boolean) { - val booleanType = Boolean::class.javaPrimitiveType ?: Boolean::class.javaObjectType var lastMissing: NoSuchMethodException? = null - for (name in methodNames) { - try { - targetClass.getMethod(name, booleanType).invoke(target, value) - return - } catch (error: NoSuchMethodException) { - lastMissing = error - continue + for (booleanType in booleanParameterTypes()) { + for (name in methodNames) { + try { + targetClass.getMethod(name, booleanType).invoke(target, value) + return + } catch (error: NoSuchMethodException) { + lastMissing = error + continue + } } } throw IllegalStateException("config setter not found: ${methodNames.joinToString()}", lastMissing) } + private fun booleanParameterTypes(): List> { + val primitive = java.lang.Boolean.TYPE + val boxed = java.lang.Boolean::class.java + return if (primitive == boxed) listOf(primitive) else listOf(primitive, boxed) + } + companion object { internal const val DEFAULT_BRIDGE_CLASS_NAME = "io.nekohasekai.p2pandroid.P2pandroid" internal const val DEFAULT_CONFIG_CLASS_NAME = "io.nekohasekai.p2pandroid.Config"