forked from MeloNX/MeloNX
add native helper to create jni string
This commit is contained in:
parent
375691b0e0
commit
437bfdbd5a
@ -33,6 +33,9 @@ namespace LibRyujinx
|
|||||||
[DllImport("libryujinxjni")]
|
[DllImport("libryujinxjni")]
|
||||||
private extern static IntPtr getStringPointer(JEnvRef jEnv, JStringLocalRef s);
|
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);
|
public delegate IntPtr JniCreateSurface(IntPtr native_surface, IntPtr instance);
|
||||||
|
|
||||||
[UnmanagedCallersOnly(EntryPoint = "JNI_OnLoad")]
|
[UnmanagedCallersOnly(EntryPoint = "JNI_OnLoad")]
|
||||||
@ -73,23 +76,6 @@ namespace LibRyujinx
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static JStringLocalRef CreateString(string str, JEnvRef jEnv)
|
|
||||||
{
|
|
||||||
return str.AsSpan().WithSafeFixed(jEnv, CreateString);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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")]
|
[UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_deviceInitialize")]
|
||||||
public static JBoolean JniInitializeDeviceNative(JEnvRef jEnv,
|
public static JBoolean JniInitializeDeviceNative(JEnvRef jEnv,
|
||||||
JObjectLocalRef jObj,
|
JObjectLocalRef jObj,
|
||||||
@ -354,16 +340,27 @@ namespace LibRyujinx
|
|||||||
File.WriteAllBytes(cachePath, info.Icon ?? new byte[0]);
|
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("TitleName"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.TitleName)._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("TitleId"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.TitleId)._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("Developer"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.Developer)._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("Version"), GetCCharSequence("Ljava/lang/String;")), CreateString(jEnv, info.Version)._value);
|
||||||
setObjectField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("IconCache"), GetCCharSequence("Ljava/lang/String;")), CreateString(iconCache, jEnv)._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);
|
setDoubleField(jEnv, newObj, getFieldId(jEnv, javaClass, GetCCharSequence("FileSize"), GetCCharSequence("D")), info.FileSize);
|
||||||
|
|
||||||
return newObj;
|
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")]
|
[UnmanagedCallersOnly(EntryPoint = "Java_org_ryujinx_android_RyujinxNative_graphicsRendererSetVsync")]
|
||||||
public static void JniSetVsyncStateNative(JEnvRef jEnv, JObjectLocalRef jObj, JBoolean enabled)
|
public static void JniSetVsyncStateNative(JEnvRef jEnv, JObjectLocalRef jObj, JBoolean enabled)
|
||||||
{
|
{
|
||||||
|
@ -119,5 +119,13 @@ char* getStringPointer(
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jstring createString(
|
||||||
|
JNIEnv *env,
|
||||||
|
char* ch) {
|
||||||
|
auto str = env->NewStringUTF(ch);
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -199,7 +199,10 @@ class HomeViews {
|
|||||||
viewModel.setViewList(list)
|
viewModel.setViewList(list)
|
||||||
LazyColumn(Modifier.fillMaxSize()) {
|
LazyColumn(Modifier.fillMaxSize()) {
|
||||||
items(list) {
|
items(list) {
|
||||||
GameItem(it, viewModel, showBottomSheet)
|
it.titleName?.apply {
|
||||||
|
if (this.isNotEmpty())
|
||||||
|
GameItem(it, viewModel, showBottomSheet)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user