QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
AndroidInit.cc
Go to the documentation of this file.
1#include "AndroidInterface.h"
2#ifndef QGC_NO_SERIAL_LINK
3#include "AndroidSerial.h"
4#endif
5#include <QtCore/QJniEnvironment>
6
8
9QGC_LOGGING_CATEGORY(AndroidInitLog, "Android.AndroidInit");
10
11#ifdef QGC_GST_STREAMING
12
13static jobject _class_loader = nullptr;
14
15extern "C" {
16extern void gst_amc_jni_set_java_vm(JavaVM* java_vm);
17
18jobject gst_android_get_application_class_loader(void)
19{
20 return _class_loader;
21}
22}
23
24#endif
25
26static jboolean jniInit(JNIEnv* env, jobject thiz)
27{
28 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
29
30#ifdef QGC_GST_STREAMING
31 const jclass contextClass = env->GetObjectClass(thiz);
32 if (!contextClass) {
33 return JNI_FALSE;
34 }
35
36 const jmethodID getClassLoaderId = env->GetMethodID(contextClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
37 if (QJniEnvironment::checkAndClearExceptions(env)) {
38 env->DeleteLocalRef(contextClass);
39 return JNI_FALSE;
40 }
41
42 const jobject classLoader = env->CallObjectMethod(thiz, getClassLoaderId);
43 if (QJniEnvironment::checkAndClearExceptions(env)) {
44 env->DeleteLocalRef(contextClass);
45 return JNI_FALSE;
46 }
47
48 if (_class_loader) {
49 env->DeleteGlobalRef(_class_loader);
50 _class_loader = nullptr;
51 }
52 _class_loader = env->NewGlobalRef(classLoader);
53 env->DeleteLocalRef(classLoader);
54 env->DeleteLocalRef(contextClass);
55#else
56 Q_UNUSED(env);
57 Q_UNUSED(thiz);
58#endif
59
60 return JNI_TRUE;
61}
62
64{
65 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
66
67 const JNINativeMethod javaMethods[]{{"nativeInit", "()Z", reinterpret_cast<void*>(jniInit)}};
68
69 QJniEnvironment env;
70 if (!env.registerNativeMethods(AndroidInterface::kJniQGCActivityClassName, javaMethods, std::size(javaMethods))) {
71 qCWarning(AndroidInitLog) << "Failed to register native methods for"
73 return JNI_ERR;
74 }
75
76 qCDebug(AndroidInitLog) << "Main Native Functions Registered";
77 return JNI_OK;
78}
79
80jint JNI_OnLoad(JavaVM* vm, void*)
81{
82 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
83
84 void* env = nullptr;
85 if (vm->GetEnv(&env, JNI_VERSION_1_6) != JNI_OK) {
86 return JNI_ERR;
87 }
88
89 if (jniSetNativeMethods() != JNI_OK) {
90 return JNI_ERR;
91 }
92
93#ifdef QGC_GST_STREAMING
94 gst_amc_jni_set_java_vm(vm);
95#endif
96
98
99#ifndef QGC_NO_SERIAL_LINK
101#endif
102
103 QNativeInterface::QAndroidApplication::hideSplashScreen(333);
104
105 return JNI_VERSION_1_6;
106}
107
108void JNI_OnUnload(JavaVM* vm, void*)
109{
110 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
111
112#ifdef QGC_GST_STREAMING
113 JNIEnv* env = nullptr;
114 if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) == JNI_OK && _class_loader) {
115 env->DeleteGlobalRef(_class_loader);
116 _class_loader = nullptr;
117 }
118#else
119 Q_UNUSED(vm);
120#endif
121
122#ifndef QGC_NO_SERIAL_LINK
124#endif
125}
jint JNI_OnLoad(JavaVM *vm, void *)
void JNI_OnUnload(JavaVM *vm, void *)
static jboolean jniInit(JNIEnv *env, jobject thiz)
static jint jniSetNativeMethods()
#define QGC_LOGGING_CATEGORY(name, categoryStr)
constexpr const char * kJniQGCActivityClassName
void setNativeMethods()