From cb887af4cf6ea2a670c93caae8732a657e0df3d4 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Sat, 14 Jul 2012 16:00:01 +0200 Subject: Moved JNI helper macros to a separate file Also initialize a reference to the CharonVpnService class during JNI_OnLoad, which allows us later to call methods from C to Java. --- .../android/jni/libandroidbridge/android_jni.h | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/frontends/android/jni/libandroidbridge/android_jni.h (limited to 'src/frontends/android/jni/libandroidbridge/android_jni.h') diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.h b/src/frontends/android/jni/libandroidbridge/android_jni.h new file mode 100644 index 000000000..8f8d30299 --- /dev/null +++ b/src/frontends/android/jni/libandroidbridge/android_jni.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2012 Tobias Brunner + * Copyright (C) 2012 Giuliano Grassi + * Copyright (C) 2012 Ralf Sager + * Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/** + * @defgroup android_jni android_jni + * @{ @ingroup libandroidbridge + */ + +#ifndef ANDROID_JNI_H_ +#define ANDROID_JNI_H_ + +#include + +#define JNI_PACKAGE org_strongswan_android +#define JNI_PACKAGE_STRING "org/strongswan/android" + +#define JNI_METHOD_PP(pack, klass, name, ret, ...) \ + ret Java_##pack##_##klass##_##name(JNIEnv *env, jobject this, ##__VA_ARGS__) + +#define JNI_METHOD_P(pack, klass, name, ret, ...) \ + JNI_METHOD_PP(pack, klass, name, ret, ##__VA_ARGS__) + +#define JNI_METHOD(klass, name, ret, ...) \ + JNI_METHOD_P(JNI_PACKAGE, klass, name, ret, ##__VA_ARGS__) + +/** + * Java classes + * Initialized in JNI_OnLoad() + */ +extern jclass *android_charonvpnservice_class; + +#endif /** ANDROID_JNI_H_ @}*/ -- cgit v1.2.3 From f83f65be08de72547bb06e5f2127d70f041d3299 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Sat, 14 Jul 2012 16:06:12 +0200 Subject: Added functions to attach/detach native threads to the JVM Even though native threads are automatically detached from the JVM with help of a thread-local destructor it is recommended to detach as soon as possible as local JNI references are not freed until a thread detaches. --- .../android/jni/libandroidbridge/android_jni.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/frontends/android/jni/libandroidbridge/android_jni.h') diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.h b/src/frontends/android/jni/libandroidbridge/android_jni.h index 8f8d30299..2a8d3a71b 100644 --- a/src/frontends/android/jni/libandroidbridge/android_jni.h +++ b/src/frontends/android/jni/libandroidbridge/android_jni.h @@ -43,4 +43,23 @@ */ extern jclass *android_charonvpnservice_class; +/** + * Attach the current thread to the JVM + * + * As local JNI references are not freed until the thread detaches + * androidjni_detach_thread() should be called as soon as possible. + * If it is not called a thread-local destructor ensures that the + * thread is at least detached as soon as it terminates. + * + * @param env JNIEnv + */ +void androidjni_attach_thread(JNIEnv **env); + +/** + * Detach the current thread from the JVM + * + * Call this as soon as possible to ensure that local JNI references are freed. + */ +void androidjni_detach_thread(); + #endif /** ANDROID_JNI_H_ @}*/ -- cgit v1.2.3 From 8bf30276431afb6d02dc1d648fe0d2ab4a8d94ce Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Sat, 14 Jul 2012 17:03:22 +0200 Subject: Moved CharonVpnService to logic sub-package --- src/frontends/android/jni/libandroidbridge/android_jni.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/frontends/android/jni/libandroidbridge/android_jni.h') diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.h b/src/frontends/android/jni/libandroidbridge/android_jni.h index 2a8d3a71b..77c33f73e 100644 --- a/src/frontends/android/jni/libandroidbridge/android_jni.h +++ b/src/frontends/android/jni/libandroidbridge/android_jni.h @@ -25,8 +25,8 @@ #include -#define JNI_PACKAGE org_strongswan_android -#define JNI_PACKAGE_STRING "org/strongswan/android" +#define JNI_PACKAGE org_strongswan_android_logic +#define JNI_PACKAGE_STRING "org/strongswan/android/logic" #define JNI_METHOD_PP(pack, klass, name, ret, ...) \ ret Java_##pack##_##klass##_##name(JNIEnv *env, jobject this, ##__VA_ARGS__) -- cgit v1.2.3 From 19567a5e3a776ba65cec7eaf375853e07d868f81 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 7 Aug 2012 13:40:47 +0200 Subject: Helper function added to handle Java exceptions in native code --- .../android/jni/libandroidbridge/android_jni.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/frontends/android/jni/libandroidbridge/android_jni.h') diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.h b/src/frontends/android/jni/libandroidbridge/android_jni.h index 77c33f73e..427c641b4 100644 --- a/src/frontends/android/jni/libandroidbridge/android_jni.h +++ b/src/frontends/android/jni/libandroidbridge/android_jni.h @@ -24,6 +24,7 @@ #define ANDROID_JNI_H_ #include +#include #define JNI_PACKAGE org_strongswan_android_logic #define JNI_PACKAGE_STRING "org/strongswan/android/logic" @@ -62,4 +63,21 @@ void androidjni_attach_thread(JNIEnv **env); */ void androidjni_detach_thread(); +/** + * Handle exceptions thrown by a JNI call + * + * @param env JNIEnv + * @return TRUE if an exception was thrown + */ +static inline bool androidjni_exception_occurred(JNIEnv *env) +{ + if ((*env)->ExceptionOccurred(env)) + { /* clear any exception, otherwise the VM is terminated */ + (*env)->ExceptionDescribe(env); + (*env)->ExceptionClear(env); + return TRUE; + } + return FALSE; +} + #endif /** ANDROID_JNI_H_ @}*/ -- cgit v1.2.3 From ae4f1ea180af58704932572e970205b3d33f62c9 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Wed, 8 Aug 2012 13:48:54 +0200 Subject: Native counterpart of VpnService.Builder added, exposed by charonservice --- src/frontends/android/jni/libandroidbridge/android_jni.h | 1 + 1 file changed, 1 insertion(+) (limited to 'src/frontends/android/jni/libandroidbridge/android_jni.h') diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.h b/src/frontends/android/jni/libandroidbridge/android_jni.h index 427c641b4..39ba56fc1 100644 --- a/src/frontends/android/jni/libandroidbridge/android_jni.h +++ b/src/frontends/android/jni/libandroidbridge/android_jni.h @@ -43,6 +43,7 @@ * Initialized in JNI_OnLoad() */ extern jclass *android_charonvpnservice_class; +extern jclass *android_charonvpnservice_builder_class; /** * Attach the current thread to the JVM -- cgit v1.2.3 From 4308ce1cf72c18d069606823427cd93eca386ed5 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Thu, 9 Aug 2012 16:38:19 +0200 Subject: Moved Java to C string conversion function to android_jni header file --- .../android/jni/libandroidbridge/android_jni.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/frontends/android/jni/libandroidbridge/android_jni.h') diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.h b/src/frontends/android/jni/libandroidbridge/android_jni.h index 39ba56fc1..774d37d7e 100644 --- a/src/frontends/android/jni/libandroidbridge/android_jni.h +++ b/src/frontends/android/jni/libandroidbridge/android_jni.h @@ -81,4 +81,23 @@ static inline bool androidjni_exception_occurred(JNIEnv *env) return FALSE; } +/** + * Convert a Java string to a C string. Memory is allocated. + * + * @param env JNIEnv + * @param jstr Java string + * @return native C string (allocated) + */ +static inline char *androidjni_convert_jstring(JNIEnv *env, jstring jstr) +{ + char *str; + jsize len; + + len = (*env)->GetStringUTFLength(env, jstr); + str = malloc(len + 1); + (*env)->GetStringUTFRegion(env, jstr, 0, len, str); + str[len] = '\0'; + return str; +} + #endif /** ANDROID_JNI_H_ @}*/ -- cgit v1.2.3