]> sigrok.org Git - sigrok-androidutils.git/blame - lib/jvm_glue.cpp
Make update-device-filter generate valid usb-device tags
[sigrok-androidutils.git] / lib / jvm_glue.cpp
CommitLineData
2b68989a 1/*
5de7ce63 2 * This file is part of the sigrok-androidutils project.
2b68989a
MC
3 *
4 * Copyright (C) 2014 Marcus Comstedt <marcus@mc.pp.se>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "libsigrokandroidutils.h"
21#include "libsigrokandroidutils-internal.h"
22
23static JavaVM *g_jvm = NULL;
24static jclass g_environment_class = 0;
25
26SRAU_PRIV int srau_get_java_env(JNIEnv **env)
27{
28 jint st;
29
6f1c3a93 30 if (g_jvm == NULL)
2b68989a 31 return -1;
2b68989a
MC
32
33 st = g_jvm->GetEnv((void **)env, JNI_VERSION_1_6);
34
35 if (st == JNI_EDETACHED) {
36 st = g_jvm->AttachCurrentThread(env, NULL);
37 if (st == JNI_OK)
38 return 1;
39 }
40
41 return (st == JNI_OK? 0 : -1);
42}
43
44SRAU_PRIV void srau_unget_java_env(int mode)
45{
6f1c3a93 46 if (mode == 1)
2b68989a 47 g_jvm->DetachCurrentThread();
2b68989a
MC
48}
49
50SRAU_PRIV jclass srau_get_environment_class(JNIEnv *env)
51{
6f1c3a93 52 if (env && g_environment_class)
2b68989a 53 return (jclass)env->NewLocalRef(g_environment_class);
6f1c3a93 54 else
2b68989a 55 return 0;
2b68989a
MC
56}
57
58jint JNI_OnLoad(JavaVM *vm, void *reserved)
59{
6f1c3a93 60 JNIEnv *env;
2b68989a
MC
61
62 (void)reserved;
63
6f1c3a93
UH
64 if (vm->GetEnv((void **)&env, JNI_VERSION_1_6) != JNI_OK)
65 return -1;
2b68989a 66
6f1c3a93 67 jclass envc = env->FindClass("org/sigrok/androidutils/Environment");
2b68989a
MC
68 if (envc) {
69 g_environment_class = (jclass)env->NewGlobalRef(envc);
70 env->DeleteLocalRef(envc);
71 }
72
73 g_jvm = vm;
74
75 return JNI_VERSION_1_6;
76}
77
78void JNI_OnUnload(JavaVM *vm, void *reserved)
79{
6f1c3a93 80 JNIEnv *env;
2b68989a
MC
81
82 (void)reserved;
83
84 g_jvm = NULL;
85
6f1c3a93
UH
86 if (vm->GetEnv((void **)&env, JNI_VERSION_1_6) != JNI_OK)
87 return;
2b68989a
MC
88
89 if (g_environment_class) {
90 env->DeleteGlobalRef(g_environment_class);
91 g_environment_class = 0;
92 }
93}