From 529c8c88a36ec2251ac32edcee0710838dece2bb Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 7 Aug 2012 15:51:00 +0200 Subject: [PATCH] Keep a global reference to the CharonVpnService object in charonservice --- .../jni/libandroidbridge/charonservice.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c index 671561f5f6..75d0da6934 100644 --- a/src/frontends/android/jni/libandroidbridge/charonservice.c +++ b/src/frontends/android/jni/libandroidbridge/charonservice.c @@ -41,6 +41,11 @@ struct private_charonservice_t { * public interface */ charonservice_t public; + + /** + * CharonVpnService reference + */ + jobject vpn_service; }; /** @@ -86,13 +91,14 @@ static void dbg_android(debug_t group, level_t level, char *fmt, ...) /** * Initialize the charonservice object */ -static void charonservice_init() +static void charonservice_init(JNIEnv *env, jobject service) { private_charonservice_t *this; INIT(this, .public = { }, + .vpn_service = (*env)->NewGlobalRef(env, service), ); charonservice = &this->public; @@ -103,10 +109,11 @@ static void charonservice_init() /** * Deinitialize the charonservice object */ -static void charonservice_deinit() +static void charonservice_deinit(JNIEnv *env) { private_charonservice_t *this = (private_charonservice_t*)charonservice; + (*env)->DeleteGlobalRef(env, this->vpn_service); free(this); charonservice = NULL; } @@ -153,13 +160,13 @@ JNI_METHOD(CharonVpnService, initializeCharon, void) return; } - charonservice_init(); + charonservice_init(env, this); if (!libcharon_init("charon") || !charon->initialize(charon, PLUGINS)) { libcharon_deinit(); - charonservice_deinit(); + charonservice_deinit(env); libipsec_deinit(); libhydra_deinit(); library_deinit(); @@ -186,7 +193,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void) JNI_METHOD(CharonVpnService, deinitializeCharon, void) { libcharon_deinit(); - charonservice_deinit(); + charonservice_deinit(env); libipsec_deinit(); libhydra_deinit(); library_deinit(); -- 2.47.2