summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-11-22 14:40:32 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-03 12:30:32 +0000
commita3ecc32e80a92ef582a84563695f0036d6021478 (patch)
tree3dac17788aadd940bed0fab7bfbf93e950f0685f
parentc28bf78f2d5f018e9fe3d594160e77d39f4f47e5 (diff)
downloadmullvadvpn-a3ecc32e80a92ef582a84563695f0036d6021478.tar.xz
mullvadvpn-a3ecc32e80a92ef582a84563695f0036d6021478.zip
Create `AndroidContext` in `mullvad-jni`
-rw-r--r--mullvad-jni/src/lib.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs
index 0e00decd04..c8503e6e8a 100644
--- a/mullvad-jni/src/lib.rs
+++ b/mullvad-jni/src/lib.rs
@@ -27,7 +27,7 @@ use std::{
sync::{mpsc, Once},
thread,
};
-use talpid_types::ErrorExt;
+use talpid_types::{android::AndroidContext, ErrorExt};
const LOG_FILENAME: &str = "daemon.log";
@@ -42,12 +42,18 @@ static LOAD_CLASSES: Once = Once::new();
#[derive(Debug, err_derive::Error)]
#[error(no_from)]
pub enum Error {
+ #[error(display = "Failed to create global reference to Java object")]
+ CreateGlobalReference(#[error(cause)] jnix::jni::errors::Error),
+
#[error(display = "Failed to create VpnService tunnel provider")]
CreateVpnServiceTunProvider(#[error(source)] vpn_service_tun_provider::Error),
#[error(display = "Failed to get cache directory path")]
GetCacheDir(#[error(source)] mullvad_paths::Error),
+ #[error(display = "Failed to get Java VM instance")]
+ GetJvmInstance(#[error(cause)] jnix::jni::errors::Error),
+
#[error(display = "Failed to get log directory path")]
GetLogDir(#[error(source)] mullvad_paths::Error),
@@ -130,6 +136,7 @@ fn initialize(
vpn_service: &JObject,
log_dir: PathBuf,
) -> Result<(), Error> {
+ let android_context = create_android_context(env, *vpn_service)?;
let tun_provider =
VpnServiceTunProvider::new(env, vpn_service).map_err(Error::CreateVpnServiceTunProvider)?;
let daemon_command_sender = spawn_daemon(env, this, tun_provider, log_dir)?;
@@ -139,6 +146,15 @@ fn initialize(
Ok(())
}
+fn create_android_context(env: &JnixEnv, vpn_service: JObject) -> Result<AndroidContext, Error> {
+ Ok(AndroidContext {
+ jvm: env.get_java_vm().map_err(Error::GetJvmInstance)?,
+ vpn_service: env
+ .new_global_ref(vpn_service)
+ .map_err(Error::CreateGlobalReference)?,
+ })
+}
+
fn spawn_daemon(
env: &JnixEnv,
this: &JObject,