123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // 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));
- }
- }
|