summaryrefslogtreecommitdiff
path: root/platform/android/src/jni/peer.hpp
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2017-01-17 13:25:27 +0100
committerKonstantin Käfer <mail@kkaefer.com>2017-01-17 13:25:27 +0100
commit7e0cc3b545a5b47a8770e55e5476e9646809a618 (patch)
treea57127d2f1e8ed14506f47f54e44f1e3028d8214 /platform/android/src/jni/peer.hpp
parentea273d4e75f51a6cb7a6fc7573c7722e34e730f1 (diff)
downloadqtlocation-mapboxgl-7e0cc3b545a5b47a8770e55e5476e9646809a618.tar.gz
[android] introduce generic Peer object for JNI wrappingupstream/7743-nativepeer-defaultfilesource
Diffstat (limited to 'platform/android/src/jni/peer.hpp')
-rw-r--r--platform/android/src/jni/peer.hpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/platform/android/src/jni/peer.hpp b/platform/android/src/jni/peer.hpp
new file mode 100644
index 0000000000..2c16cce710
--- /dev/null
+++ b/platform/android/src/jni/peer.hpp
@@ -0,0 +1,40 @@
+#pragma once
+
+#include <jni/jni.hpp>
+
+#include <memory>
+
+namespace mbgl {
+namespace android {
+
+template <typename T>
+class Peer {
+public:
+ static constexpr auto Name();
+ static void RegisterNative(jni::JNIEnv&);
+
+ static T& Get(jni::JNIEnv& env, const jni::Object<Peer<T>>& obj) {
+ jni::Field<Peer, jlong> field{ env, javaClass, peer };
+ return *reinterpret_cast<Peer*>(obj.Get(env, field))->native;
+ }
+
+protected:
+ template <typename... Args>
+ Peer(Args&&... args) : native(std::make_unique<T>(std::forward<Args>(args)...)) {
+ }
+
+ const std::unique_ptr<T> native;
+
+private:
+ static const char* peer;
+ static jni::Class<Peer<T>> javaClass;
+};
+
+template <typename T>
+jni::Class<Peer<T>> Peer<T>::javaClass;
+
+template <typename T>
+const char* Peer<T>::peer = "peer";
+
+} // namespace android
+} // namespace mbgl