summaryrefslogtreecommitdiff
path: root/Source/Android/jni/SkylanderConfig.cpp
diff options
context:
space:
mode:
authorJoshua de Reeper <joshua@dereeper.co.nz>2023-01-26 13:10:58 +1300
committerJoshua de Reeper <joshua@dereeper.co.nz>2023-02-02 21:16:14 +1300
commit680db55239b0382f790b27b42e4e394e5cc74d3d (patch)
treef49b0cc802c2112cb6a31678ea0a685242a9e76b /Source/Android/jni/SkylanderConfig.cpp
parent6cb8df76583d19751641dc8fa5310c07e595292b (diff)
Android: Add Skylanders Portal
Co-Authored-By: Charles Lombardo <clombardo169@gmail.com>
Diffstat (limited to 'Source/Android/jni/SkylanderConfig.cpp')
-rw-r--r--Source/Android/jni/SkylanderConfig.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/Source/Android/jni/SkylanderConfig.cpp b/Source/Android/jni/SkylanderConfig.cpp
new file mode 100644
index 0000000000..4d6c0d1375
--- /dev/null
+++ b/Source/Android/jni/SkylanderConfig.cpp
@@ -0,0 +1,168 @@
+// Copyright 2023 Dolphin Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <jni.h>
+
+#include <array>
+
+#include "AndroidCommon/AndroidCommon.h"
+#include "Core/IOS/USB/Emulated/Skylander.h"
+#include "Core/System.h"
+
+extern "C" {
+
+JNIEXPORT jobject JNICALL
+Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getSkylanderMap(JNIEnv* env,
+ jclass clazz)
+{
+ jclass hash_map_class = env->FindClass("java/util/HashMap");
+ jmethodID hash_map_init = env->GetMethodID(hash_map_class, "<init>", "(I)V");
+ jobject hash_map_obj = env->NewObject(hash_map_class, hash_map_init,
+ static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
+ jmethodID hash_map_put = env->GetMethodID(
+ hash_map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+
+ jclass skylander_class =
+ env->FindClass("org/dolphinemu/dolphinemu/features/skylanders/model/SkylanderPair");
+
+ jmethodID skylander_init = env->GetMethodID(skylander_class, "<init>", "(II)V");
+
+ for (const auto& it : IOS::HLE::USB::list_skylanders)
+ {
+ const std::string& name = it.second;
+ jobject skylander_obj =
+ env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
+ env->CallObjectMethod(hash_map_obj, hash_map_put, skylander_obj, ToJString(env, name));
+ env->DeleteLocalRef(skylander_obj);
+ }
+
+ return hash_map_obj;
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getInverseSkylanderMap(
+ JNIEnv* env, jclass clazz)
+{
+ jclass hash_map_class = env->FindClass("java/util/HashMap");
+ jmethodID hash_map_init = env->GetMethodID(hash_map_class, "<init>", "(I)V");
+ jobject hash_map_obj = env->NewObject(hash_map_class, hash_map_init,
+ static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
+ jmethodID hash_map_put = env->GetMethodID(
+ hash_map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+
+ jclass skylander_class =
+ env->FindClass("org/dolphinemu/dolphinemu/features/skylanders/model/SkylanderPair");
+
+ jmethodID skylander_init = env->GetMethodID(skylander_class, "<init>", "(II)V");
+
+ for (const auto& it : IOS::HLE::USB::list_skylanders)
+ {
+ const std::string& name = it.second;
+ jobject skylander_obj =
+ env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
+ env->CallObjectMethod(hash_map_obj, hash_map_put, ToJString(env, name), skylander_obj);
+ env->DeleteLocalRef(skylander_obj);
+ }
+
+ return hash_map_obj;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_removeSkylander(JNIEnv* env,
+ jclass clazz,
+ jint slot)
+{
+ auto& system = Core::System::GetInstance();
+ return static_cast<jboolean>(system.GetSkylanderPortal().RemoveSkylander(slot));
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_loadSkylander(JNIEnv* env,
+ jclass clazz,
+ jint slot,
+ jstring file_name)
+{
+ File::IOFile sky_file(GetJString(env, file_name), "r+b");
+ if (!sky_file)
+ {
+ return nullptr;
+ }
+ std::array<u8, 0x40 * 0x10> file_data;
+ if (!sky_file.ReadBytes(file_data.data(), file_data.size()))
+ {
+ return nullptr;
+ }
+
+ jclass pair_class = env->FindClass("android/util/Pair");
+ jmethodID pair_init =
+ env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
+ jclass integer_class = env->FindClass("java/lang/Integer");
+ jmethodID int_init = env->GetMethodID(integer_class, "<init>", "(I)V");
+
+ auto& system = Core::System::GetInstance();
+ system.GetSkylanderPortal().RemoveSkylander(slot);
+ std::string name = "Unknown";
+
+ std::pair<u16, u16> id_var = system.GetSkylanderPortal().CalculateIDs(file_data);
+
+ const auto it = IOS::HLE::USB::list_skylanders.find(std::make_pair(id_var.first, id_var.second));
+
+ if (it != IOS::HLE::USB::list_skylanders.end())
+ {
+ name = it->second;
+ }
+
+ return env->NewObject(pair_class, pair_init,
+ env->NewObject(integer_class, int_init,
+ system.GetSkylanderPortal().LoadSkylander(
+ file_data.data(), std::move(sky_file))),
+ ToJString(env, name));
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_createSkylander(
+ JNIEnv* env, jclass clazz, jint id, jint var, jstring fileName, jint slot)
+{
+ u16 sky_id = static_cast<u16>(id);
+ u16 sky_var = static_cast<u16>(var);
+
+ std::string file_name = GetJString(env, fileName);
+
+ auto& system = Core::System::GetInstance();
+ system.GetSkylanderPortal().CreateSkylander(file_name, sky_id, sky_var);
+ system.GetSkylanderPortal().RemoveSkylander(slot);
+
+ jclass pair_class = env->FindClass("android/util/Pair");
+ jmethodID pair_init =
+ env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
+
+ jclass integer_class = env->FindClass("java/lang/Integer");
+ jmethodID integer_init = env->GetMethodID(integer_class, "<init>", "(I)V");
+
+ File::IOFile sky_file(file_name, "r+b");
+ if (!sky_file)
+ {
+ return nullptr;
+ }
+ std::array<u8, 0x40 * 0x10> file_data;
+ if (!sky_file.ReadBytes(file_data.data(), file_data.size()))
+ {
+ return nullptr;
+ }
+
+ std::string name = "Unknown";
+
+ const auto it = IOS::HLE::USB::list_skylanders.find(std::make_pair(sky_id, sky_var));
+
+ if (it != IOS::HLE::USB::list_skylanders.end())
+ {
+ name = it->second;
+ }
+
+ return env->NewObject(pair_class, pair_init,
+ env->NewObject(integer_class, integer_init,
+ system.GetSkylanderPortal().LoadSkylander(
+ file_data.data(), std::move(sky_file))),
+ ToJString(env, name));
+}
+}