SkylanderConfig.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // Copyright 2023 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <jni.h>
  4. #include <array>
  5. #include "AndroidCommon/AndroidCommon.h"
  6. #include "AndroidCommon/IDCache.h"
  7. #include "Core/IOS/USB/Emulated/Skylanders/Skylander.h"
  8. #include "Core/System.h"
  9. extern "C" {
  10. JNIEXPORT jobject JNICALL
  11. Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getSkylanderMap(JNIEnv* env,
  12. jclass clazz)
  13. {
  14. jobject hash_map_obj = env->NewObject(IDCache::GetHashMapClass(), IDCache::GetHashMapInit(),
  15. static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
  16. jclass skylander_class =
  17. env->FindClass("org/dolphinemu/dolphinemu/features/skylanders/model/SkylanderPair");
  18. jmethodID skylander_init = env->GetMethodID(skylander_class, "<init>", "(II)V");
  19. for (const auto& it : IOS::HLE::USB::list_skylanders)
  20. {
  21. const std::string& name = it.second.name;
  22. jobject skylander_obj =
  23. env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
  24. env->CallObjectMethod(hash_map_obj, IDCache::GetHashMapPut(), skylander_obj,
  25. ToJString(env, name));
  26. env->DeleteLocalRef(skylander_obj);
  27. }
  28. return hash_map_obj;
  29. }
  30. JNIEXPORT jobject JNICALL
  31. Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getInverseSkylanderMap(
  32. JNIEnv* env, jclass clazz)
  33. {
  34. jobject hash_map_obj = env->NewObject(IDCache::GetHashMapClass(), IDCache::GetHashMapInit(),
  35. static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
  36. jclass skylander_class =
  37. env->FindClass("org/dolphinemu/dolphinemu/features/skylanders/model/SkylanderPair");
  38. jmethodID skylander_init = env->GetMethodID(skylander_class, "<init>", "(II)V");
  39. for (const auto& it : IOS::HLE::USB::list_skylanders)
  40. {
  41. const std::string& name = it.second.name;
  42. jobject skylander_obj =
  43. env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
  44. env->CallObjectMethod(hash_map_obj, IDCache::GetHashMapPut(), ToJString(env, name),
  45. skylander_obj);
  46. env->DeleteLocalRef(skylander_obj);
  47. }
  48. return hash_map_obj;
  49. }
  50. JNIEXPORT jboolean JNICALL
  51. Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_removeSkylander(JNIEnv* env,
  52. jclass clazz,
  53. jint slot)
  54. {
  55. auto& system = Core::System::GetInstance();
  56. return static_cast<jboolean>(system.GetSkylanderPortal().RemoveSkylander(slot));
  57. }
  58. JNIEXPORT jobject JNICALL
  59. Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_loadSkylander(JNIEnv* env,
  60. jclass clazz,
  61. jint slot,
  62. jstring file_name)
  63. {
  64. File::IOFile sky_file(GetJString(env, file_name), "r+b");
  65. if (!sky_file)
  66. {
  67. return nullptr;
  68. }
  69. std::array<u8, 0x40 * 0x10> file_data;
  70. if (!sky_file.ReadBytes(file_data.data(), file_data.size()))
  71. {
  72. return nullptr;
  73. }
  74. jclass pair_class = env->FindClass("android/util/Pair");
  75. jmethodID pair_init =
  76. env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
  77. jclass integer_class = env->FindClass("java/lang/Integer");
  78. jmethodID int_init = env->GetMethodID(integer_class, "<init>", "(I)V");
  79. auto& system = Core::System::GetInstance();
  80. system.GetSkylanderPortal().RemoveSkylander(slot);
  81. std::string name = "Unknown";
  82. std::pair<u16, u16> id_var = system.GetSkylanderPortal().CalculateIDs(file_data);
  83. const auto it = IOS::HLE::USB::list_skylanders.find(std::make_pair(id_var.first, id_var.second));
  84. if (it != IOS::HLE::USB::list_skylanders.end())
  85. {
  86. name = it->second.name;
  87. }
  88. return env->NewObject(
  89. pair_class, pair_init,
  90. env->NewObject(integer_class, int_init,
  91. system.GetSkylanderPortal().LoadSkylander(
  92. std::make_unique<IOS::HLE::USB::SkylanderFigure>(std::move(sky_file)))),
  93. ToJString(env, name));
  94. }
  95. JNIEXPORT jobject JNICALL
  96. Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_createSkylander(
  97. JNIEnv* env, jclass clazz, jint id, jint var, jstring fileName, jint slot)
  98. {
  99. u16 sky_id = static_cast<u16>(id);
  100. u16 sky_var = static_cast<u16>(var);
  101. std::string file_name = GetJString(env, fileName);
  102. auto& system = Core::System::GetInstance();
  103. {
  104. IOS::HLE::USB::SkylanderFigure figure(file_name);
  105. figure.Create(sky_id, sky_var);
  106. figure.Close();
  107. }
  108. system.GetSkylanderPortal().RemoveSkylander(slot);
  109. jclass pair_class = env->FindClass("android/util/Pair");
  110. jmethodID pair_init =
  111. env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
  112. jclass integer_class = env->FindClass("java/lang/Integer");
  113. jmethodID integer_init = env->GetMethodID(integer_class, "<init>", "(I)V");
  114. File::IOFile sky_file(file_name, "r+b");
  115. if (!sky_file)
  116. {
  117. return nullptr;
  118. }
  119. std::array<u8, 0x40 * 0x10> file_data;
  120. if (!sky_file.ReadBytes(file_data.data(), file_data.size()))
  121. {
  122. return nullptr;
  123. }
  124. std::string name = "Unknown";
  125. const auto it = IOS::HLE::USB::list_skylanders.find(std::make_pair(sky_id, sky_var));
  126. if (it != IOS::HLE::USB::list_skylanders.end())
  127. {
  128. name = it->second.name;
  129. }
  130. return env->NewObject(
  131. pair_class, pair_init,
  132. env->NewObject(integer_class, integer_init,
  133. system.GetSkylanderPortal().LoadSkylander(
  134. std::make_unique<IOS::HLE::USB::SkylanderFigure>(std::move(sky_file)))),
  135. ToJString(env, name));
  136. }
  137. }