diff options
Diffstat (limited to 'Source/Android/jni/NetPlay/Netplay.cpp')
| -rw-r--r-- | Source/Android/jni/NetPlay/Netplay.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/Source/Android/jni/NetPlay/Netplay.cpp b/Source/Android/jni/NetPlay/Netplay.cpp index d6e24d250b..16804b808b 100644 --- a/Source/Android/jni/NetPlay/Netplay.cpp +++ b/Source/Android/jni/NetPlay/Netplay.cpp @@ -1,8 +1,11 @@ // Copyright 2026 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include <array> #include <memory> #include <string> +#include <tuple> +#include <type_traits> #include <vector> #include <jni.h> @@ -38,6 +41,30 @@ static NetPlay::NetPlayServer* GetServerPointer(JNIEnv* env, jobject obj) env->GetLongField(obj, IDCache::GetNetPlayServerPointer())); } +static jintArray PadMappingArrayToJIntArray(JNIEnv* env, const NetPlay::PadMappingArray& mapping) +{ + const jsize size = static_cast<jsize>(mapping.size()); + jintArray jmapping = env->NewIntArray(size); + std::array<jint, std::tuple_size_v<std::decay_t<decltype(mapping)>>> values; + for (size_t i = 0; i < mapping.size(); i++) + values[i] = static_cast<jint>(mapping[i]); + env->SetIntArrayRegion(jmapping, 0, size, values.data()); + return jmapping; +} + +static bool JIntArrayToPadMappingArray(JNIEnv* env, jintArray jmapping, + NetPlay::PadMappingArray* mapping) +{ + if (env->GetArrayLength(jmapping) != static_cast<jsize>(mapping->size())) + return false; + + std::array<jint, std::tuple_size_v<std::decay_t<decltype(*mapping)>>> values; + env->GetIntArrayRegion(jmapping, 0, static_cast<jsize>(values.size()), values.data()); + for (size_t i = 0; i < mapping->size(); i++) + (*mapping)[i] = static_cast<NetPlay::PlayerId>(values[i]); + return true; +} + extern "C" { JNIEXPORT void JNICALL @@ -224,6 +251,54 @@ Java_org_dolphinemu_dolphinemu_features_netplay_NetplaySession_nativeReconnectTr Common::g_TraversalClient->ReconnectToServer(); } +JNIEXPORT jintArray JNICALL +Java_org_dolphinemu_dolphinemu_features_netplay_NetplaySession_nativeGetPadMapping(JNIEnv* env, + jobject obj) +{ + auto* server = GetServerPointer(env, obj); + if (!server) + return env->NewIntArray(0); + + return PadMappingArrayToJIntArray(env, server->GetPadMapping()); +} + +JNIEXPORT jintArray JNICALL +Java_org_dolphinemu_dolphinemu_features_netplay_NetplaySession_nativeGetWiimoteMapping(JNIEnv* env, + jobject obj) +{ + auto* server = GetServerPointer(env, obj); + if (!server) + return env->NewIntArray(0); + + return PadMappingArrayToJIntArray(env, server->GetWiimoteMapping()); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_netplay_NetplaySession_nativeSetPadMapping( + JNIEnv* env, jobject obj, jintArray jmapping) +{ + auto* server = GetServerPointer(env, obj); + if (!server) + return; + + NetPlay::PadMappingArray mapping = server->GetPadMapping(); + if (JIntArrayToPadMappingArray(env, jmapping, &mapping)) + server->SetPadMapping(mapping); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_netplay_NetplaySession_nativeSetWiimoteMapping( + JNIEnv* env, jobject obj, jintArray jmapping) +{ + auto* server = GetServerPointer(env, obj); + if (!server) + return; + + NetPlay::PadMappingArray mapping = server->GetWiimoteMapping(); + if (JIntArrayToPadMappingArray(env, jmapping, &mapping)) + server->SetWiimoteMapping(mapping); +} + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_netplay_NetplaySession_nativeReleaseUICallbacks( JNIEnv*, jobject, jlong pointer) |
