diff options
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt | 9 | ||||
| -rw-r--r-- | talpid-core/src/offline/android.rs | 16 |
2 files changed, 25 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt index 143587d340..369d61b813 100644 --- a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt +++ b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt @@ -12,6 +12,8 @@ class ConnectivityListener : BroadcastReceiver() { var isConnected = true private set + var senderAddress = 0L + fun register(context: Context) { val intentFilter = IntentFilter() @@ -49,4 +51,11 @@ class ConnectivityListener : BroadcastReceiver() { networkInfo.detailedState == DetailedState.CONNECTED }) } + + private fun finalize() { + destroySender(senderAddress) + senderAddress = 0L + } + + private external fun destroySender(senderAddress: Long) } diff --git a/talpid-core/src/offline/android.rs b/talpid-core/src/offline/android.rs index e62147a03c..5f21e143e8 100644 --- a/talpid-core/src/offline/android.rs +++ b/talpid-core/src/offline/android.rs @@ -1,5 +1,6 @@ use crate::tunnel_state_machine::TunnelCommand; use futures::sync::mpsc::UnboundedSender; +use jnix::jni::{objects::JObject, sys::jlong, JNIEnv}; use std::sync::Weak; #[derive(err_derive::Error, Debug)] @@ -14,6 +15,21 @@ impl MonitorHandle { } } +/// Entry point for Android Java code to return ownership of the sender reference. +#[no_mangle] +#[allow(non_snake_case)] +pub extern "system" fn Java_net_mullvad_talpid_ConnectivityListener_destroySender( + _: JNIEnv<'_>, + _: JObject<'_>, + sender_address: jlong, +) { + let _ = unsafe { get_sender_from_address(sender_address) }; +} + +unsafe fn get_sender_from_address(address: jlong) -> Box<Weak<UnboundedSender<TunnelCommand>>> { + Box::from_raw(address as *mut Weak<UnboundedSender<TunnelCommand>>) +} + pub fn spawn_monitor( _sender: Weak<UnboundedSender<TunnelCommand>>, ) -> Result<MonitorHandle, Error> { |
