From 610fc7bee3a55b049f906efa109422f46b7126c1 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 8 Feb 2023 13:59:28 +0100 Subject: qtart android: make sure callbacks are rooted so they don't get GCed randomly --- .../main/java/net/taler/qtart/TalerWalletCore.kt | 35 +++++++++++++++------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'QuickJS-android') diff --git a/QuickJS-android/qtart/src/main/java/net/taler/qtart/TalerWalletCore.kt b/QuickJS-android/qtart/src/main/java/net/taler/qtart/TalerWalletCore.kt index 6e0c605..b62014e 100644 --- a/QuickJS-android/qtart/src/main/java/net/taler/qtart/TalerWalletCore.kt +++ b/QuickJS-android/qtart/src/main/java/net/taler/qtart/TalerWalletCore.kt @@ -38,23 +38,28 @@ import com.sun.jna.Native import com.sun.jna.Pointer class TalerWalletCore { - private interface TalerNative: Library { + private interface TalerNative : Library { companion object { val INSTANCE: TalerNative by lazy { Native.load("talerwalletcore", TalerNative::class.java) } } - interface TALER_WALLET_MessageHandlerFn: Callback { + interface TALER_WALLET_MessageHandlerFn : Callback { fun invoke(handler_p: Pointer, message: String) } - interface TALER_LogFn: Callback { + interface TALER_LogFn : Callback { fun invoke(cls: Pointer, stream: Int, msg: String) } fun TALER_WALLET_create(): Pointer - fun TALER_WALLET_set_message_handler(twi: Pointer, handler_f: TALER_WALLET_MessageHandlerFn, handler_p: Pointer) + fun TALER_WALLET_set_message_handler( + twi: Pointer, + handler_f: TALER_WALLET_MessageHandlerFn, + handler_p: Pointer + ) + fun TALER_WALLET_send_request(twi: Pointer, request: String): Int fun TALER_WALLET_run(twi: Pointer): Int fun TALER_WALLET_join(twi: Pointer) @@ -63,21 +68,29 @@ class TalerWalletCore { private val walletInstance: Pointer = TalerNative.INSTANCE.TALER_WALLET_create() + private var currentMessageHandler: TalerNative.TALER_WALLET_MessageHandlerFn? = null + private var currentLogHandler: TalerNative.TALER_LogFn? = null + fun setMessageHandler(handler: (msg: String) -> Unit) { + this.currentMessageHandler = object : TalerNative.TALER_WALLET_MessageHandlerFn { + override fun invoke(handler_p: Pointer, message: String) { + handler(message) + } + } TalerNative.INSTANCE.TALER_WALLET_set_message_handler( - walletInstance, object : TalerNative.TALER_WALLET_MessageHandlerFn { - override fun invoke(handler_p: Pointer, message: String) { - handler(message) - } - }, walletInstance) + walletInstance, + this.currentMessageHandler!!, + walletInstance + ) } fun setStdoutHandler(handler: (msg: String) -> Unit) { - TalerNative.INSTANCE.TALER_start_redirect_std(object : TalerNative.TALER_LogFn { + this.currentLogHandler = object : TalerNative.TALER_LogFn { override fun invoke(cls: Pointer, stream: Int, msg: String) { handler(msg) } - }, walletInstance) + } + TalerNative.INSTANCE.TALER_start_redirect_std(this.currentLogHandler!!, walletInstance) } fun sendRequest(request: String) { -- cgit v1.2.3