summaryrefslogtreecommitdiff
path: root/Source/Android/jni/Config/ConfigChangedCallback.cpp
blob: 2ec8b06541cf7243076ee6698bfb3cf8a5ab1afc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Copyright 2023 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#include <jni.h>

#include "Common/Config/Config.h"
#include "jni/AndroidCommon/AndroidCommon.h"
#include "jni/AndroidCommon/IDCache.h"

struct ConfigChangedCallbackContext
{
  jobject runnable;
  Config::ConfigChangedCallbackID callback_id;
};

extern "C" {

JNIEXPORT jlong JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_ConfigChangedCallback_initialize(
    JNIEnv* env, jclass, jobject runnable)
{
  auto* context = new ConfigChangedCallbackContext;

  jobject runnable_global = env->NewGlobalRef(runnable);
  context->runnable = runnable_global;
  context->callback_id = Config::AddConfigChangedCallback([runnable_global] {
    IDCache::GetEnvForThread()->CallVoidMethod(runnable_global, IDCache::GetRunnableRun());
  });

  return reinterpret_cast<jlong>(context);
}

JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_settings_model_ConfigChangedCallback_deinitialize(
    JNIEnv* env, jclass, jlong pointer)
{
  auto* context = reinterpret_cast<ConfigChangedCallbackContext*>(pointer);

  Config::RemoveConfigChangedCallback(context->callback_id);
  env->DeleteGlobalRef(context->runnable);

  delete context;
}
}