summaryrefslogtreecommitdiff
path: root/platform/android/src/jni/generic_global_ref_deleter.hpp
blob: b865ee9f8b87aad8795f43c7b16de79ded723e54 (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
45
#pragma once

#include <jni/jni.hpp>

#include "../attach_env.hpp"

namespace mbgl {
namespace android {

// A deleter that doesn't retain an JNIEnv handle but instead tries to attach the JVM. This means
// it can be used on any thread to delete a global ref.
struct GenericGlobalRefDeleter {
    void operator()(jni::jobject* p) const {
        if (p) {
            AttachEnv()->DeleteGlobalRef(jni::Unwrap(p));
        }
    }
};

struct GenericWeakGlobalRefDeleter {
    void operator()(jni::jobject* p) const {
        if (p) {
            AttachEnv()->DeleteWeakGlobalRef(jni::Unwrap(p));
        }
    }
};

template < class T >
using GenericGlobal = jni::UniquePointerlike< T, GenericGlobalRefDeleter >;

template < class T >
using GenericWeak = jni::UniquePointerlike< T, GenericWeakGlobalRefDeleter >;

template < class T >
GenericGlobal<T> SeizeGenericGlobal(T&& t) {
    return GenericGlobal<T>(std::move(t), GenericGlobalRefDeleter());
};

template < class T >
GenericWeak<T> SeizeGenericWeak(T&& t) {
    return GenericWeak<T>(std::move(t), GenericWeakGlobalRefDeleter());
};

} // namespace android
} // namespace mbgl