manager: Add the ability to get a list of active managers

This commit is contained in:
ShirkNeko
2025-07-06 00:26:42 +08:00
parent 42b883240e
commit 2bd6929d24
12 changed files with 216 additions and 4 deletions

View File

@@ -394,4 +394,43 @@ NativeBridgeNP(clearDynamicSign, jboolean) {
bool result = clear_dynamic_sign();
LogDebug("clearDynamicSign: result=%d", result);
return result;
}
}
NativeBridgeNP(getManagersList, jobject) {
struct manager_list_info info;
bool result = get_managers_list(&info);
if (!result) {
LogDebug("getManagersList: failed to get managers list");
return NULL;
}
jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagersList");
jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", "()V");
jobject obj = GetEnvironment()->NewObject(env, cls, constructor);
jfieldID countField = GetEnvironment()->GetFieldID(env, cls, "count", "I");
jfieldID managersField = GetEnvironment()->GetFieldID(env, cls, "managers", "Ljava/util/List;");
GetEnvironment()->SetIntField(env, obj, countField, (jint)info.count);
jclass arrayListCls = GetEnvironment()->FindClass(env, "java/util/ArrayList");
jmethodID arrayListConstructor = GetEnvironment()->GetMethodID(env, arrayListCls, "<init>", "()V");
jobject managersList = GetEnvironment()->NewObject(env, arrayListCls, arrayListConstructor);
jmethodID addMethod = GetEnvironment()->GetMethodID(env, arrayListCls, "add", "(Ljava/lang/Object;)Z");
jclass managerInfoCls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagerInfo");
jmethodID managerInfoConstructor = GetEnvironment()->GetMethodID(env, managerInfoCls, "<init>", "(II)V");
for (int i = 0; i < info.count; i++) {
jobject managerInfo = GetEnvironment()->NewObject(env, managerInfoCls, managerInfoConstructor,
(jint)info.managers[i].uid,
(jint)info.managers[i].signature_index);
GetEnvironment()->CallBooleanMethod(env, managersList, addMethod, managerInfo);
}
GetEnvironment()->SetObjectField(env, obj, managersField, managersList);
LogDebug("getManagersList: count=%d", info.count);
return obj;
}