From f8abc2c0e6f75e7475ef836234d14cd77b7cb244 Mon Sep 17 00:00:00 2001 From: Joshua de Reeper Date: Mon, 1 May 2023 22:30:31 +1200 Subject: Android: Infinity Base UI Add a UI option for the Infinity Base within the Android Emulation Activity --- Source/Android/jni/InfinityConfig.cpp | 126 ++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 Source/Android/jni/InfinityConfig.cpp (limited to 'Source/Android/jni/InfinityConfig.cpp') diff --git a/Source/Android/jni/InfinityConfig.cpp b/Source/Android/jni/InfinityConfig.cpp new file mode 100644 index 0000000000..cd96dfc74c --- /dev/null +++ b/Source/Android/jni/InfinityConfig.cpp @@ -0,0 +1,126 @@ +// Copyright 2023 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include + +#include "AndroidCommon/AndroidCommon.h" +#include "Core/IOS/USB/Emulated/Infinity.h" +#include "Core/System.h" + +extern "C" { + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_infinitybase_InfinityConfig_getFigureMap(JNIEnv* env, + jobject obj) +{ + auto& system = Core::System::GetInstance(); + + jobject hash_map_obj = env->NewObject(IDCache::GetHashMapClass(), IDCache::GetHashMapInit(), + system.GetInfinityBase().GetFigureList().size()); + + jmethodID hash_map_put = env->GetMethodID( + hash_map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + + jclass long_class = env->FindClass("java/lang/Long"); + jmethodID long_init = env->GetMethodID(long_class, "", "(J)V"); + + for (const auto& it : system.GetInfinityBase().GetFigureList()) + { + const std::string& name = it.first; + jobject figure_number = env->NewObject(long_class, long_init, (jlong)it.second); + env->CallObjectMethod(hash_map_obj, IDCache::GetHashMapPut(), figure_number, + ToJString(env, name)); + env->DeleteLocalRef(figure_number); + } + + return hash_map_obj; +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_infinitybase_InfinityConfig_getInverseFigureMap(JNIEnv* env, + jobject obj) +{ + auto& system = Core::System::GetInstance(); + + jobject hash_map_obj = env->NewObject(IDCache::GetHashMapClass(), IDCache::GetHashMapInit(), + system.GetInfinityBase().GetFigureList().size()); + + jmethodID hash_map_put = env->GetMethodID( + hash_map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + + jclass long_class = env->FindClass("java/lang/Long"); + jmethodID long_init = env->GetMethodID(long_class, "", "(J)V"); + + for (const auto& it : system.GetInfinityBase().GetFigureList()) + { + const std::string& name = it.first; + jobject figure_number = env->NewObject(long_class, long_init, (jlong)it.second); + env->CallObjectMethod(hash_map_obj, IDCache::GetHashMapPut(), ToJString(env, name), + figure_number); + env->DeleteLocalRef(figure_number); + } + + return hash_map_obj; +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_infinitybase_InfinityConfig_removeFigure(JNIEnv* env, + jclass clazz, + jint position) +{ + auto& system = Core::System::GetInstance(); + system.GetInfinityBase().RemoveFigure(position); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_infinitybase_InfinityConfig_loadFigure(JNIEnv* env, + jclass clazz, + jint position, + jstring file_name) +{ + File::IOFile inf_file(GetJString(env, file_name), "r+b"); + if (!inf_file) + { + return nullptr; + } + std::array file_data{}; + if (!inf_file.ReadBytes(file_data.data(), file_data.size())) + { + return nullptr; + } + + auto& system = Core::System::GetInstance(); + system.GetInfinityBase().RemoveFigure(position); + return ToJString(env, + system.GetInfinityBase().LoadFigure(file_data, std::move(inf_file), position)); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_infinitybase_InfinityConfig_createFigure( + JNIEnv* env, jclass clazz, jlong figure_number, jstring fileName, jint position) +{ + u32 fig_num = static_cast(figure_number); + + std::string file_name = GetJString(env, fileName); + + auto& system = Core::System::GetInstance(); + system.GetInfinityBase().CreateFigure(file_name, fig_num); + system.GetInfinityBase().RemoveFigure(position); + + File::IOFile inf_file(file_name, "r+b"); + if (!inf_file) + { + return nullptr; + } + std::array file_data{}; + if (!inf_file.ReadBytes(file_data.data(), file_data.size())) + { + return nullptr; + } + + return ToJString(env, + system.GetInfinityBase().LoadFigure(file_data, std::move(inf_file), position)); +} +} -- cgit v1.2.3