Keep a global reference to the CharonVpnService object in charonservice

This commit is contained in:
Tobias Brunner
2012-08-13 11:00:26 +02:00
parent a304874319
commit 529c8c88a3
@@ -41,6 +41,11 @@ struct private_charonservice_t {
* public interface * public interface
*/ */
charonservice_t public; 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 * Initialize the charonservice object
*/ */
static void charonservice_init() static void charonservice_init(JNIEnv *env, jobject service)
{ {
private_charonservice_t *this; private_charonservice_t *this;
INIT(this, INIT(this,
.public = { .public = {
}, },
.vpn_service = (*env)->NewGlobalRef(env, service),
); );
charonservice = &this->public; charonservice = &this->public;
@@ -103,10 +109,11 @@ static void charonservice_init()
/** /**
* Deinitialize the charonservice object * Deinitialize the charonservice object
*/ */
static void charonservice_deinit() static void charonservice_deinit(JNIEnv *env)
{ {
private_charonservice_t *this = (private_charonservice_t*)charonservice; private_charonservice_t *this = (private_charonservice_t*)charonservice;
(*env)->DeleteGlobalRef(env, this->vpn_service);
free(this); free(this);
charonservice = NULL; charonservice = NULL;
} }
@@ -153,13 +160,13 @@ JNI_METHOD(CharonVpnService, initializeCharon, void)
return; return;
} }
charonservice_init(); charonservice_init(env, this);
if (!libcharon_init("charon") || if (!libcharon_init("charon") ||
!charon->initialize(charon, PLUGINS)) !charon->initialize(charon, PLUGINS))
{ {
libcharon_deinit(); libcharon_deinit();
charonservice_deinit(); charonservice_deinit(env);
libipsec_deinit(); libipsec_deinit();
libhydra_deinit(); libhydra_deinit();
library_deinit(); library_deinit();
@@ -186,7 +193,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, void)
JNI_METHOD(CharonVpnService, deinitializeCharon, void) JNI_METHOD(CharonVpnService, deinitializeCharon, void)
{ {
libcharon_deinit(); libcharon_deinit();
charonservice_deinit(); charonservice_deinit(env);
libipsec_deinit(); libipsec_deinit();
libhydra_deinit(); libhydra_deinit();
library_deinit(); library_deinit();