summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt9
-rw-r--r--talpid-core/src/offline/android.rs16
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> {