diff --git a/Ryujinx.sln b/Ryujinx.sln index 118f0ee67..8ef4cba80 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -87,7 +87,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon", "src\Ryuj EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Generators", "src\Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj", "{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibRyujinx.Shared", "src\LibRyujinx\LibRyujinx.Shared.csproj", "{5BBF478C-A520-41E7-9B88-890AD26766B8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibRyujinx.Shared", "src\LibRyujinx\LibRyujinx.csproj", "{5BBF478C-A520-41E7-9B88-890AD26766B8}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{C75176EB-C44E-449A-8077-A48AD94534EE}" EndProject diff --git a/src/LibRyujinx/AndroidLogTarget.cs b/src/LibRyujinx/AndroidLogTarget.cs index c07e84771..937b02bf2 100644 --- a/src/LibRyujinx/AndroidLogTarget.cs +++ b/src/LibRyujinx/AndroidLogTarget.cs @@ -1,5 +1,7 @@ using Ryujinx.Common; using Ryujinx.Common.Logging; +using Ryujinx.Common.Logging.Formatters; +using Ryujinx.Common.Logging.Targets; using System; using System.IO; using System.Linq; diff --git a/src/LibRyujinx/JniExportedMethods.cs b/src/LibRyujinx/JniExportedMethods.cs index b8fbd4b14..fca2483ea 100644 --- a/src/LibRyujinx/JniExportedMethods.cs +++ b/src/LibRyujinx/JniExportedMethods.cs @@ -10,6 +10,8 @@ using LibRyujinx.Jni; using Rxmxnx.PInvoke; using System.Text; using LibRyujinx.Jni.Internal.Pointers; +using Ryujinx.Common.Logging; +using Ryujinx.Common.Logging.Targets; using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.KHR; @@ -32,7 +34,16 @@ namespace LibRyujinx Ryujinx.Common.SystemInfo.SystemInfo.IsBionic = true; - return Initialize(path); + var init = Initialize(path); + + Logger.AddTarget( + new AsyncLogTargetWrapper( + new AndroidLogTarget("Ryujinx"), + 1000, + AsyncLogTargetOverflowAction.Block + )); + + return init; } private static string GetString(JEnvRef jEnv, JStringLocalRef jString) @@ -54,6 +65,17 @@ namespace LibRyujinx return str; } + private static JStringLocalRef CreateString(in IReadOnlyFixedContext ctx, JEnvRef jEnv) + { + JEnvValue value = jEnv.Environment; + ref JNativeInterface jInterface = ref value.Functions; + + IntPtr newStringPtr = jInterface.NewStringPointer; + NewStringDelegate newString = newStringPtr.GetUnsafeDelegate(); + + return newString(jEnv, ctx.Pointer, ctx.Values.Length); + } + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_deviceInitialize")] public static JBoolean JniInitializeDeviceNative(JEnvRef jEnv, JObjectLocalRef jObj, JBoolean isHostMapped) { @@ -204,6 +226,62 @@ namespace LibRyujinx { _swapBuffersCallback = Marshal.GetDelegateForFunctionPointer(swapBuffersCallback); } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputInitialize")] + public static void JniInitializeInput(JEnvRef jEnv, JObjectLocalRef jObj, JInt width, JInt height) + { + InitializeInput(width, height); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetClientSize")] + public static void JniSetClientSize(JEnvRef jEnv, JObjectLocalRef jObj, JInt width, JInt height) + { + SetClientSize(width, height); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetTouchPoint")] + public static void JniSetTouchPoint(JEnvRef jEnv, JObjectLocalRef jObj, JInt x, JInt y) + { + SetTouchPoint(x, y); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputReleaseTouchPoint")] + public static void JniReleaseTouchPoint(JEnvRef jEnv, JObjectLocalRef jObj) + { + ReleaseTouchPoint(); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputUpdate")] + public static void JniUpdateInput(JEnvRef jEnv, JObjectLocalRef jObj) + { + UpdateInput(); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetButtonPressed")] + public static void JniSetButtonPressed(JEnvRef jEnv, JObjectLocalRef jObj, JInt button, JStringLocalRef id) + { + SetButtonPressed((Ryujinx.Input.GamepadButtonInputId)(int)button, GetString(jEnv, id)); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetButtonReleased")] + public static void JniSetButtonReleased(JEnvRef jEnv, JObjectLocalRef jObj, JInt button, JStringLocalRef id) + { + SetButtonReleased((Ryujinx.Input.GamepadButtonInputId)(int)button, GetString(jEnv, id)); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputSetStickAxis")] + public static void JniSetStickAxis(JEnvRef jEnv, JObjectLocalRef jObj, JInt stick, JFloat x, JFloat y, JStringLocalRef id) + { + SetStickAxis((Ryujinx.Input.StickInputId)(int)stick, new System.Numerics.Vector2(x, y), GetString(jEnv, id)); + } + + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_inputConnectGamepad")] + public static JStringLocalRef JniConnectGamepad(JEnvRef jEnv, JObjectLocalRef jObj, JInt index) + { + var id = ConnectGamepad(index); + + return (id ?? "").AsSpan().WithSafeFixed(jEnv, CreateString); + } } internal static partial class Logcat diff --git a/src/LibRyujinx/LibRyujinx.cs b/src/LibRyujinx/LibRyujinx.cs index 911a81532..d9ae799d7 100644 --- a/src/LibRyujinx/LibRyujinx.cs +++ b/src/LibRyujinx/LibRyujinx.cs @@ -41,12 +41,6 @@ namespace LibRyujinx ConfigurationState.Initialize(); LoggerModule.Initialize(); - Logger.AddTarget( - new AsyncLogTargetWrapper( - new AndroidLogTarget("Ryujinx"), - 1000, - AsyncLogTargetOverflowAction.Block - )); SwitchDevice = new SwitchDevice(); diff --git a/src/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs b/src/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs index b1cffcb56..2ff49526a 100644 --- a/src/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs +++ b/src/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs @@ -3,7 +3,7 @@ using System.Text; namespace Ryujinx.Common.Logging.Formatters { - internal class DefaultLogFormatter : ILogFormatter + public class DefaultLogFormatter : ILogFormatter { private static readonly ObjectPool _stringBuilderPool = SharedPools.Default();