diff --git a/src/LibRyujinx/Android/JniExportedMethods.cs b/src/LibRyujinx/Android/JniExportedMethods.cs index 2207d307f..782b05c11 100644 --- a/src/LibRyujinx/Android/JniExportedMethods.cs +++ b/src/LibRyujinx/Android/JniExportedMethods.cs @@ -33,6 +33,9 @@ namespace LibRyujinx [DllImport("libryujinxjni")] private extern static IntPtr getStringPointer(JEnvRef jEnv, JStringLocalRef s); + [DllImport("libryujinxjni")] + private extern static JStringLocalRef createString(JEnvRef jEnv, IntPtr ch); + public delegate IntPtr JniCreateSurface(IntPtr native_surface, IntPtr instance); [UnmanagedCallersOnly(EntryPoint = "JNI_OnLoad")] @@ -73,23 +76,6 @@ namespace LibRyujinx return s; } - private static JStringLocalRef CreateString(string str, JEnvRef jEnv) - { - return str.AsSpan().WithSafeFixed(jEnv, CreateString); - } - - - 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, @@ -354,16 +340,27 @@ namespace LibRyujinx File.WriteAllBytes(cachePath, info.Icon ?? new byte[0]); } - setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("TitleName"), GetCCharSequence("Ljava/lang/String;")), CreateString(info.TitleName, jEnv)._value); - setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("TitleId"), GetCCharSequence("Ljava/lang/String;")), CreateString(info.TitleId, jEnv)._value); - setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("Developer"), GetCCharSequence("Ljava/lang/String;")), CreateString(info.Developer, jEnv)._value); - setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("Version"), GetCCharSequence("Ljava/lang/String;")), CreateString(info.Version, jEnv)._value); - setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("IconCache"), GetCCharSequence("Ljava/lang/String;")), CreateString(iconCache, jEnv)._value); + setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("TitleName"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.TitleName)._value); + setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("TitleId"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.TitleId)._value); + setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("Developer"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.Developer)._value); + setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("Version"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.Version)._value); + setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("IconCache"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, iconCache)._value); setDoubleField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("FileSize"), GetCCharSequence("D")), info.FileSize); return newObj; } + private static JStringLocalRef CreateString(JEnvRef jEnv, string s) + { + var ptr = Marshal.StringToHGlobalAnsi(s); + + var str = createString(jEnv, ptr); + + Marshal.FreeHGlobal(ptr); + + return str; + } + [UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_graphicsRendererSetVsync")] public static void JniSetVsyncStateNative(JEnvRef jEnv, JObjectLocalRef jObj, JBoolean enabled) { diff --git a/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp b/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp index 0c072f8f3..e5db677e0 100644 --- a/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp +++ b/src/RyujinxAndroid/app/src/main/cpp/ryujinx.cpp @@ -119,5 +119,13 @@ char* getStringPointer( return s; } +jstring createString( + JNIEnv *env, + char* ch) { + auto str = env->NewStringUTF(ch); + + return str; +} + } \ No newline at end of file diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt index 9cd581da0..7962a1c95 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/views/HomeViews.kt @@ -199,7 +199,10 @@ class HomeViews { viewModel.setViewList(list) LazyColumn(Modifier.fillMaxSize()) { items(list) { - GameItem(it, viewModel, showBottomSheet) + it.titleName?.apply { + if (this.isNotEmpty()) + GameItem(it, viewModel, showBottomSheet) + } } } }