diff options
Diffstat (limited to 'tunnel/tools/libwg-go/jni.c')
-rw-r--r-- | tunnel/tools/libwg-go/jni.c | 50 |
1 files changed, 45 insertions, 5 deletions
diff --git a/tunnel/tools/libwg-go/jni.c b/tunnel/tools/libwg-go/jni.c index 7ad94d35..353cb474 100644 --- a/tunnel/tools/libwg-go/jni.c +++ b/tunnel/tools/libwg-go/jni.c @@ -3,31 +3,58 @@ * Copyright © 2017-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. */ +#include <assert.h> #include <jni.h> #include <stdlib.h> #include <string.h> +#include <android/log.h> + +#define TAG "WireGuard/GoBackend" struct go_string { const char *str; long n; }; -extern int wgTurnOn(struct go_string ifname, int tun_fd, struct go_string settings); -extern void wgTurnOff(int handle); +extern int wgTurnOn(struct go_string ifname, int tun_fd, struct go_string settings, void *eventHandler); +extern void *wgTurnOff(int handle); extern int wgGetSocketV4(int handle); extern int wgGetSocketV6(int handle); extern char *wgGetConfig(int handle); extern char *wgVersion(); +extern void wgOnEvent(void *eventHandler, const char *event); + +static JavaVM *gVm; +static jclass gEventHandlerClass; +static jmethodID gOnEventMethod; + +JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) +{ + JNIEnv* env; + char buf[128]; + + gVm = vm; + if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + return JNI_ERR; + } + + gEventHandlerClass = (*env)->FindClass(env, "com/wireguard/android/backend/EventHandler"); -JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOn(JNIEnv *env, jclass c, jstring ifname, jint tun_fd, jstring settings) + gOnEventMethod = (*env)->GetMethodID(env, gEventHandlerClass, "onEvent", "(Ljava/lang/String;)V"); + + return JNI_VERSION_1_6; +} + +JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOn(JNIEnv *env, jclass c, jstring ifname, jint tun_fd, jstring settings, jobject eventHandler) { const char *ifname_str = (*env)->GetStringUTFChars(env, ifname, 0); size_t ifname_len = (*env)->GetStringUTFLength(env, ifname); const char *settings_str = (*env)->GetStringUTFChars(env, settings, 0); size_t settings_len = (*env)->GetStringUTFLength(env, settings); + jobject event_handler = (*env)->NewGlobalRef(env, eventHandler); int ret = wgTurnOn((struct go_string){ .str = ifname_str, .n = ifname_len }, tun_fd, (struct go_string){ .str = settings_str, .n = settings_len - }); + }, event_handler); (*env)->ReleaseStringUTFChars(env, ifname, ifname_str); (*env)->ReleaseStringUTFChars(env, settings, settings_str); return ret; @@ -35,7 +62,9 @@ JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOn(JNI JNIEXPORT void JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOff(JNIEnv *env, jclass c, jint handle) { - wgTurnOff(handle); + jobject event_handler = wgTurnOff(handle); + if (event_handler) + (*env)->DeleteGlobalRef(env, event_handler); } JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgGetSocketV4(JNIEnv *env, jclass c, jint handle) @@ -69,3 +98,14 @@ JNIEXPORT jstring JNICALL Java_com_wireguard_android_backend_GoBackend_wgVersion free(version); return ret; } + +void wgOnEvent(void *eventHandler, const char *event) +{ + JavaVMAttachArgs attachArgs = { JNI_VERSION_1_6, NULL, NULL }; + jobject jEventHandler = eventHandler; + JNIEnv *env; + jint rs = (*gVm)->AttachCurrentThread(gVm, &env, &attachArgs); + assert (rs == JNI_OK); + jstring jevent = (*env)->NewStringUTF(env, event); + (*env)->CallVoidMethod(env, jEventHandler, gOnEventMethod, jevent); +} |