// SPDX-License-Identifier: MPL-2.0 // Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/) #pragma once #include #include namespace skyline { /** * @brief The JvmManager class is used to simplify transactions with the Java component */ class JvmManager { public: JavaVM *vm{}; //!< A pointer to the Java VM jobject instance; //!< A reference to the activity jclass instanceClass; //!< The class of the activity /** * @param env A pointer to the JNI environment * @param instance A reference to the activity */ JvmManager(JNIEnv *env, jobject instance); /** * @brief Attach the current thread to the Java VM */ void AttachThread(); /** * @brief Detach the current thread to the Java VM */ void DetachThread(); /** * @brief Returns a pointer to the JNI environment for the current thread */ JNIEnv *GetEnv(); /** * @brief Retrieves a specific field of the given type from the activity * @tparam objectType The type of the object in the field * @param key The name of the field in the activity class * @return The contents of the field as objectType */ template inline objectType GetField(const char *key) { JNIEnv *env = GetEnv(); if constexpr(std::is_same()) return env->GetBooleanField(instance, env->GetFieldID(instanceClass, key, "Z")); else if constexpr(std::is_same()) return env->GetByteField(instance, env->GetFieldID(instanceClass, key, "B")); else if constexpr(std::is_same()) return env->GetCharField(instance, env->GetFieldID(instanceClass, key, "C")); else if constexpr(std::is_same()) return env->GetShortField(instance, env->GetFieldID(instanceClass, key, "S")); else if constexpr(std::is_same()) return env->GetIntField(instance, env->GetFieldID(instanceClass, key, "I")); else if constexpr(std::is_same()) return env->GetLongField(instance, env->GetFieldID(instanceClass, key, "J")); else if constexpr(std::is_same()) return env->GetFloatField(instance, env->GetFieldID(instanceClass, key, "F")); else if constexpr(std::is_same()) return env->GetDoubleField(instance, env->GetFieldID(instanceClass, key, "D")); } /** * @brief Retrieves a specific field from the activity as a jobject * @param key The name of the field in the activity class * @param signature The signature of the field * @return A jobject of the contents of the field */ jobject GetField(const char *key, const char *signature); /** * @brief Checks if a specific field from the activity is null or not * @param key The name of the field in the activity class * @param signature The signature of the field * @return If the field is null or not */ bool CheckNull(const char *key, const char *signature); /** * @brief Checks if a specific jobject is null or not * @param object The jobject to check * @return If the object is null or not */ bool CheckNull(jobject &object); }; }