From 6828fe62709bc3c8337e5e5473ec964b0e2a33fe Mon Sep 17 00:00:00 2001
From: Emmanuel Hansen <emmausssss@gmail.com>
Date: Mon, 26 Jun 2023 07:27:43 +0000
Subject: [PATCH] fix android bionic log

---
 Ryujinx.sln                                   |  2 +-
 src/LibRyujinx/AndroidLogTarget.cs            |  2 +
 src/LibRyujinx/JniExportedMethods.cs          | 80 ++++++++++++++++++-
 src/LibRyujinx/LibRyujinx.cs                  |  6 --
 .../Logging/Formatters/DefaultLogFormatter.cs |  2 +-
 5 files changed, 83 insertions(+), 9 deletions(-)

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<Char> ctx, JEnvRef jEnv)
+        {
+            JEnvValue value = jEnv.Environment;
+            ref JNativeInterface jInterface = ref value.Functions;
+
+            IntPtr newStringPtr = jInterface.NewStringPointer;
+            NewStringDelegate newString = newStringPtr.GetUnsafeDelegate<NewStringDelegate>();
+
+            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>(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<StringBuilder> _stringBuilderPool = SharedPools.Default<StringBuilder>();