46static jboolean
jniInit(JNIEnv *env, jobject thiz)
48 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
50 const jclass context_cls = env->GetObjectClass(thiz);
55 const jmethodID get_app_context_id = env->GetMethodID(context_cls,
"getApplicationContext",
"()Landroid/content/Context;");
56 env->DeleteLocalRef(context_cls);
57 if (QJniEnvironment::checkAndClearExceptions(env)) {
61 const jobject app_context = env->CallObjectMethod(thiz, get_app_context_id);
62 if (QJniEnvironment::checkAndClearExceptions(env) || !app_context) {
66 const jclass app_context_cls = env->GetObjectClass(app_context);
67 if (!app_context_cls) {
68 env->DeleteLocalRef(app_context);
72 const jmethodID get_class_loader_id = env->GetMethodID(app_context_cls,
"getClassLoader",
"()Ljava/lang/ClassLoader;");
73 env->DeleteLocalRef(app_context_cls);
74 if (QJniEnvironment::checkAndClearExceptions(env)) {
75 env->DeleteLocalRef(app_context);
79 const jobject class_loader = env->CallObjectMethod(app_context, get_class_loader_id);
80 if (QJniEnvironment::checkAndClearExceptions(env)) {
81 env->DeleteLocalRef(app_context);
85 const jobject app_context_global = env->NewGlobalRef(app_context);
86 const jobject class_loader_global = env->NewGlobalRef(class_loader);
88 env->DeleteLocalRef(app_context);
89 env->DeleteLocalRef(class_loader);
91 if (!app_context_global || !class_loader_global || QJniEnvironment::checkAndClearExceptions(env)) {
92 if (app_context_global) {
93 env->DeleteGlobalRef(app_context_global);
95 if (class_loader_global) {
96 env->DeleteGlobalRef(class_loader_global);
101 if (jobject old_context =
_context.exchange(app_context_global, std::memory_order_acq_rel)) {
102 env->DeleteGlobalRef(old_context);
104 if (jobject old_class_loader =
_class_loader.exchange(class_loader_global, std::memory_order_acq_rel)) {
105 env->DeleteGlobalRef(old_class_loader);
113 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
115 const JNINativeMethod javaMethods[] {
116 {
"nativeInit",
"()Z",
reinterpret_cast<void *
>(
jniInit)},
119 QJniEnvironment jniEnv;
120 (void) jniEnv.checkAndClearExceptions();
125 (void) jniEnv.checkAndClearExceptions();
129 const jint val = jniEnv->RegisterNatives(objectClass, javaMethods, std::size(javaMethods));
130 jniEnv->DeleteLocalRef(objectClass);
132 qCWarning(AndroidInitLog) <<
"Error registering methods:" << val;
133 (void) jniEnv.checkAndClearExceptions();
137 qCDebug(AndroidInitLog) <<
"Main Native Functions Registered";
139 (void) jniEnv.checkAndClearExceptions();
172 qCDebug(AndroidInitLog) << Q_FUNC_INFO;
174 JNIEnv* env =
nullptr;
175 if (vm->GetEnv(
reinterpret_cast<void**
>(&env), JNI_VERSION_1_6) == JNI_OK) {
176 if (jobject ctx =
_context.exchange(
nullptr, std::memory_order_acq_rel)) {
177 env->DeleteGlobalRef(ctx);
179 if (jobject cl =
_class_loader.exchange(
nullptr, std::memory_order_acq_rel)) {
180 env->DeleteGlobalRef(cl);
184 _java_vm.store(
nullptr, std::memory_order_release);
186#ifndef QGC_NO_SERIAL_LINK