mirror of
				https://github.com/dolphin-emu/dolphin.git
				synced 2025-10-25 01:19:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2023 Dolphin Emulator Project
 | |
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| #include <jni.h>
 | |
| 
 | |
| #include <array>
 | |
| 
 | |
| #include "AndroidCommon/AndroidCommon.h"
 | |
| #include "AndroidCommon/IDCache.h"
 | |
| #include "Core/IOS/USB/Emulated/Skylanders/Skylander.h"
 | |
| #include "Core/System.h"
 | |
| 
 | |
| extern "C" {
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getSkylanderMap(JNIEnv* env,
 | |
|                                                                                    jclass clazz)
 | |
| {
 | |
|   jobject hash_map_obj = env->NewObject(IDCache::GetHashMapClass(), IDCache::GetHashMapInit(),
 | |
|                                         static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
 | |
| 
 | |
|   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.name;
 | |
|     jobject skylander_obj =
 | |
|         env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
 | |
|     env->CallObjectMethod(hash_map_obj, IDCache::GetHashMapPut(), 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)
 | |
| {
 | |
|   jobject hash_map_obj = env->NewObject(IDCache::GetHashMapClass(), IDCache::GetHashMapInit(),
 | |
|                                         static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
 | |
| 
 | |
|   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.name;
 | |
|     jobject skylander_obj =
 | |
|         env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
 | |
|     env->CallObjectMethod(hash_map_obj, IDCache::GetHashMapPut(), 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.name;
 | |
|   }
 | |
| 
 | |
|   return env->NewObject(
 | |
|       pair_class, pair_init,
 | |
|       env->NewObject(integer_class, int_init,
 | |
|                      system.GetSkylanderPortal().LoadSkylander(
 | |
|                          std::make_unique<IOS::HLE::USB::SkylanderFigure>(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();
 | |
|   {
 | |
|     IOS::HLE::USB::SkylanderFigure figure(file_name);
 | |
|     figure.Create(sky_id, sky_var);
 | |
|     figure.Close();
 | |
|   }
 | |
|   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.name;
 | |
|   }
 | |
| 
 | |
|   return env->NewObject(
 | |
|       pair_class, pair_init,
 | |
|       env->NewObject(integer_class, integer_init,
 | |
|                      system.GetSkylanderPortal().LoadSkylander(
 | |
|                          std::make_unique<IOS::HLE::USB::SkylanderFigure>(std::move(sky_file)))),
 | |
|       ToJString(env, name));
 | |
| }
 | |
| }
 |