manager: Updated dependency library version

- Add JNI macros to simplify field setup and object creation
This commit is contained in:
ShirkNeko
2025-07-06 14:44:36 +08:00
parent b8f2d15bd1
commit fb5c7c2f9d
4 changed files with 106 additions and 79 deletions

View File

@@ -1,6 +1,5 @@
@file:Suppress("UnstableApiUsage") @file:Suppress("UnstableApiUsage")
import com.android.build.api.dsl.ApkSigningConfig
import com.android.build.gradle.internal.api.BaseVariantOutputImpl import com.android.build.gradle.internal.api.BaseVariantOutputImpl
import com.android.build.gradle.tasks.PackageAndroidArtifact import com.android.build.gradle.tasks.PackageAndroidArtifact

View File

@@ -19,6 +19,13 @@ NativeBridgeNP(getVersion, jint) {
return get_version(); return get_version();
} }
// get VERSION FULL
NativeBridgeNP(getFullVersion, jstring) {
char buff[255] = { 0 };
get_full_version((char *) &buff);
return GetEnvironment()->NewStringUTF(env, buff);
}
NativeBridgeNP(getAllowList, jintArray) { NativeBridgeNP(getAllowList, jintArray) {
int uids[1024]; int uids[1024];
int size = 0; int size = 0;
@@ -291,16 +298,19 @@ NativeBridge(setSuEnabled, jboolean, jboolean enabled) {
return set_su_enabled(enabled); return set_su_enabled(enabled);
} }
// Check if KPM is enabled
NativeBridgeNP(isKPMEnabled, jboolean) { NativeBridgeNP(isKPMEnabled, jboolean) {
return is_KPM_enable(); return is_KPM_enable();
} }
// Get HOOK type
NativeBridgeNP(getHookType, jstring) { NativeBridgeNP(getHookType, jstring) {
char hook_type[16]; char hook_type[16];
get_hook_type(hook_type, sizeof(hook_type)); get_hook_type(hook_type, sizeof(hook_type));
return GetEnvironment()->NewStringUTF(env, hook_type); return GetEnvironment()->NewStringUTF(env, hook_type);
} }
// SuSFS Related Function Status
NativeBridgeNP(getSusfsFeatureStatus, jobject) { NativeBridgeNP(getSusfsFeatureStatus, jobject) {
struct susfs_feature_status status; struct susfs_feature_status status;
bool result = get_susfs_feature_status(&status); bool result = get_susfs_feature_status(&status);
@@ -313,46 +323,25 @@ NativeBridgeNP(getSusfsFeatureStatus, jobject) {
jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", "()V"); jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", "()V");
jobject obj = GetEnvironment()->NewObject(env, cls, constructor); jobject obj = GetEnvironment()->NewObject(env, cls, constructor);
// 设置各个字段 SET_BOOLEAN_FIELD(obj, cls, statusSusPath, status.status_sus_path);
jfieldID statusSusPathField = GetEnvironment()->GetFieldID(env, cls, "statusSusPath", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusSusMount, status.status_sus_mount);
jfieldID statusSusMountField = GetEnvironment()->GetFieldID(env, cls, "statusSusMount", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusAutoDefaultMount, status.status_auto_default_mount);
jfieldID statusAutoDefaultMountField = GetEnvironment()->GetFieldID(env, cls, "statusAutoDefaultMount", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusAutoBindMount, status.status_auto_bind_mount);
jfieldID statusAutoBindMountField = GetEnvironment()->GetFieldID(env, cls, "statusAutoBindMount", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusSusKstat, status.status_sus_kstat);
jfieldID statusSusKstatField = GetEnvironment()->GetFieldID(env, cls, "statusSusKstat", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusTryUmount, status.status_try_umount);
jfieldID statusTryUmountField = GetEnvironment()->GetFieldID(env, cls, "statusTryUmount", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusAutoTryUmountBind, status.status_auto_try_umount_bind);
jfieldID statusAutoTryUmountBindField = GetEnvironment()->GetFieldID(env, cls, "statusAutoTryUmountBind", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusSpoofUname, status.status_spoof_uname);
jfieldID statusSpoofUnameField = GetEnvironment()->GetFieldID(env, cls, "statusSpoofUname", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusEnableLog, status.status_enable_log);
jfieldID statusEnableLogField = GetEnvironment()->GetFieldID(env, cls, "statusEnableLog", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusHideSymbols, status.status_hide_symbols);
jfieldID statusHideSymbolsField = GetEnvironment()->GetFieldID(env, cls, "statusHideSymbols", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusSpoofCmdline, status.status_spoof_cmdline);
jfieldID statusSpoofCmdlineField = GetEnvironment()->GetFieldID(env, cls, "statusSpoofCmdline", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusOpenRedirect, status.status_open_redirect);
jfieldID statusOpenRedirectField = GetEnvironment()->GetFieldID(env, cls, "statusOpenRedirect", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusMagicMount, status.status_magic_mount);
jfieldID statusMagicMountField = GetEnvironment()->GetFieldID(env, cls, "statusMagicMount", "Z"); SET_BOOLEAN_FIELD(obj, cls, statusSusSu, status.status_sus_su);
jfieldID statusSusSuField = GetEnvironment()->GetFieldID(env, cls, "statusSusSu", "Z");
GetEnvironment()->SetBooleanField(env, obj, statusSusPathField, status.status_sus_path);
GetEnvironment()->SetBooleanField(env, obj, statusSusMountField, status.status_sus_mount);
GetEnvironment()->SetBooleanField(env, obj, statusAutoDefaultMountField, status.status_auto_default_mount);
GetEnvironment()->SetBooleanField(env, obj, statusAutoBindMountField, status.status_auto_bind_mount);
GetEnvironment()->SetBooleanField(env, obj, statusSusKstatField, status.status_sus_kstat);
GetEnvironment()->SetBooleanField(env, obj, statusTryUmountField, status.status_try_umount);
GetEnvironment()->SetBooleanField(env, obj, statusAutoTryUmountBindField, status.status_auto_try_umount_bind);
GetEnvironment()->SetBooleanField(env, obj, statusSpoofUnameField, status.status_spoof_uname);
GetEnvironment()->SetBooleanField(env, obj, statusEnableLogField, status.status_enable_log);
GetEnvironment()->SetBooleanField(env, obj, statusHideSymbolsField, status.status_hide_symbols);
GetEnvironment()->SetBooleanField(env, obj, statusSpoofCmdlineField, status.status_spoof_cmdline);
GetEnvironment()->SetBooleanField(env, obj, statusOpenRedirectField, status.status_open_redirect);
GetEnvironment()->SetBooleanField(env, obj, statusMagicMountField, status.status_magic_mount);
GetEnvironment()->SetBooleanField(env, obj, statusSusSuField, status.status_sus_su);
return obj; return obj;
} }
NativeBridgeNP(getFullVersion, jstring) { // dynamic sign
char buff[255] = { 0 };
get_full_version((char *) &buff);
return GetEnvironment()->NewStringUTF(env, buff);
}
NativeBridge(setDynamicSign, jboolean, jint size, jstring hash) { NativeBridge(setDynamicSign, jboolean, jint size, jstring hash) {
if (!hash) { if (!hash) {
LogDebug("setDynamicSign: hash is null"); LogDebug("setDynamicSign: hash is null");
@@ -376,15 +365,11 @@ NativeBridgeNP(getDynamicSign, jobject) {
return NULL; return NULL;
} }
jobject obj = CREATE_JAVA_OBJECT("com/sukisu/ultra/Natives$DynamicSignConfig");
jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$DynamicSignConfig"); jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$DynamicSignConfig");
jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", "()V");
jobject obj = GetEnvironment()->NewObject(env, cls, constructor);
jfieldID sizeField = GetEnvironment()->GetFieldID(env, cls, "size", "I"); SET_INT_FIELD(obj, cls, size, (jint)config.size);
jfieldID hashField = GetEnvironment()->GetFieldID(env, cls, "hash", "Ljava/lang/String;"); SET_STRING_FIELD(obj, cls, hash, config.hash);
GetEnvironment()->SetIntField(env, obj, sizeField, (jint)config.size);
GetEnvironment()->SetObjectField(env, obj, hashField, GetEnvironment()->NewStringUTF(env, config.hash));
LogDebug("getDynamicSign: size=0x%x, hash=%.16s...", config.size, config.hash); LogDebug("getDynamicSign: size=0x%x, hash=%.16s...", config.size, config.hash);
return obj; return obj;
@@ -396,41 +381,35 @@ NativeBridgeNP(clearDynamicSign, jboolean) {
return result; return result;
} }
// Get a list of active managers
NativeBridgeNP(getManagersList, jobject) { NativeBridgeNP(getManagersList, jobject) {
struct manager_list_info info; struct manager_list_info managerListInfo;
bool result = get_managers_list(&info); bool result = get_managers_list(&managerListInfo);
if (!result) { if (!result) {
LogDebug("getManagersList: failed to get managers list"); LogDebug("getManagersList: failed to get active managers list");
return NULL; return NULL;
} }
jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagersList"); jobject obj = CREATE_JAVA_OBJECT("com/sukisu/ultra/Natives$ManagersList");
jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", "()V"); jclass managerListCls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagersList");
jobject obj = GetEnvironment()->NewObject(env, cls, constructor);
jfieldID countField = GetEnvironment()->GetFieldID(env, cls, "count", "I"); SET_INT_FIELD(obj, managerListCls, count, (jint)managerListInfo.count);
jfieldID managersField = GetEnvironment()->GetFieldID(env, cls, "managers", "Ljava/util/List;");
GetEnvironment()->SetIntField(env, obj, countField, (jint)info.count); jobject managersList = CREATE_ARRAYLIST();
jclass arrayListCls = GetEnvironment()->FindClass(env, "java/util/ArrayList"); for (int i = 0; i < managerListInfo.count; i++) {
jmethodID arrayListConstructor = GetEnvironment()->GetMethodID(env, arrayListCls, "<init>", "()V"); jobject managerInfo = CREATE_JAVA_OBJECT_WITH_PARAMS(
jobject managersList = GetEnvironment()->NewObject(env, arrayListCls, arrayListConstructor); "com/sukisu/ultra/Natives$ManagerInfo",
jmethodID addMethod = GetEnvironment()->GetMethodID(env, arrayListCls, "add", "(Ljava/lang/Object;)Z"); "(II)V",
(jint)managerListInfo.managers[i].uid,
jclass managerInfoCls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagerInfo"); (jint)managerListInfo.managers[i].signature_index
jmethodID managerInfoConstructor = GetEnvironment()->GetMethodID(env, managerInfoCls, "<init>", "(II)V"); );
ADD_TO_LIST(managersList, managerInfo);
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); SET_OBJECT_FIELD(obj, managerListCls, managers, managersList);
LogDebug("getManagersList: count=%d", info.count); LogDebug("getManagersList: count=%d", managerListInfo.count);
return obj; return obj;
} }

View File

@@ -12,6 +12,55 @@
#define NativeBridge(fn, rtn, ...) JNIEXPORT rtn JNICALL Java_com_sukisu_ultra_Natives_##fn(JNIEnv* env, jclass clazz, __VA_ARGS__) #define NativeBridge(fn, rtn, ...) JNIEXPORT rtn JNICALL Java_com_sukisu_ultra_Natives_##fn(JNIEnv* env, jclass clazz, __VA_ARGS__)
#define NativeBridgeNP(fn, rtn) JNIEXPORT rtn JNICALL Java_com_sukisu_ultra_Natives_##fn(JNIEnv* env, jclass clazz) #define NativeBridgeNP(fn, rtn) JNIEXPORT rtn JNICALL Java_com_sukisu_ultra_Natives_##fn(JNIEnv* env, jclass clazz)
// Macros to simplify field setup
#define SET_BOOLEAN_FIELD(obj, cls, fieldName, value) do { \
jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "Z"); \
GetEnvironment()->SetBooleanField(env, obj, field, value); \
} while(0)
#define SET_INT_FIELD(obj, cls, fieldName, value) do { \
jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "I"); \
GetEnvironment()->SetIntField(env, obj, field, value); \
} while(0)
#define SET_STRING_FIELD(obj, cls, fieldName, value) do { \
jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "Ljava/lang/String;"); \
GetEnvironment()->SetObjectField(env, obj, field, GetEnvironment()->NewStringUTF(env, value)); \
} while(0)
#define SET_OBJECT_FIELD(obj, cls, fieldName, value) do { \
jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "Ljava/util/List;"); \
GetEnvironment()->SetObjectField(env, obj, field, value); \
} while(0)
// Macros for creating Java objects
#define CREATE_JAVA_OBJECT(className) ({ \
jclass cls = GetEnvironment()->FindClass(env, className); \
jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", "()V"); \
GetEnvironment()->NewObject(env, cls, constructor); \
})
// Macros for creating ArrayList
#define CREATE_ARRAYLIST() ({ \
jclass arrayListCls = GetEnvironment()->FindClass(env, "java/util/ArrayList"); \
jmethodID constructor = GetEnvironment()->GetMethodID(env, arrayListCls, "<init>", "()V"); \
GetEnvironment()->NewObject(env, arrayListCls, constructor); \
})
// Macros for adding elements to an ArrayList
#define ADD_TO_LIST(list, item) do { \
jclass cls = GetEnvironment()->GetObjectClass(env, list); \
jmethodID addMethod = GetEnvironment()->GetMethodID(env, cls, "add", "(Ljava/lang/Object;)Z"); \
GetEnvironment()->CallBooleanMethod(env, list, addMethod, item); \
} while(0)
// Macros for creating Java objects with parameter constructors
#define CREATE_JAVA_OBJECT_WITH_PARAMS(className, signature, ...) ({ \
jclass cls = GetEnvironment()->FindClass(env, className); \
jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "<init>", signature); \
GetEnvironment()->NewObject(env, cls, constructor, __VA_ARGS__); \
})
#define LogDebug(...) __android_log_print(ANDROID_LOG_DEBUG, "KernelSU", __VA_ARGS__) #define LogDebug(...) __android_log_print(ANDROID_LOG_DEBUG, "KernelSU", __VA_ARGS__)
#endif #endif

View File

@@ -1,27 +1,27 @@
[versions] [versions]
accompanist-drawablepainter = "0.37.3" accompanist-drawablepainter = "0.37.3"
agp = "8.11.0" agp = "8.11.0"
gson = "2.11.0" gson = "2.13.1"
kotlin = "2.1.20" kotlin = "2.1.21"
ksp = "2.1.20-2.0.0" ksp = "2.1.21-2.0.1"
compose-bom = "2025.05.01" compose-bom = "2025.06.01"
lifecycle = "2.9.0" lifecycle = "2.9.1"
navigation = "2.9.0" navigation = "2.9.1"
activity-compose = "1.10.1" activity-compose = "1.10.1"
kotlinx-coroutines = "1.10.2" kotlinx-coroutines = "1.10.2"
coil-compose = "2.7.0" coil-compose = "2.7.0"
compose-destination = "2.1.0" compose-destination = "2.2.0"
sheets-compose-dialogs = "1.3.0" sheets-compose-dialogs = "1.3.0"
markdown = "4.6.2" markdown = "4.6.2"
webkit = "1.13.0" webkit = "1.14.0"
appiconloader-coil = "1.5.0" appiconloader-coil = "1.5.0"
parcelablelist = "2.0.1" parcelablelist = "2.0.1"
libsu = "6.0.0" libsu = "6.0.0"
apksign = "1.4" apksign = "1.4"
cmaker = "1.2" cmaker = "1.2"
compose-material = "1.8.2" compose-material = "1.8.3"
compose-material3 = "1.3.2" compose-material3 = "1.3.2"
compose-ui = "1.8.2" compose-ui = "1.8.3"
documentfile = "1.1.0" documentfile = "1.1.0"
mmrl = "2bb00b3c2b" mmrl = "2bb00b3c2b"
@@ -81,7 +81,7 @@ sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs"
markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" } markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" }
lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "27.0.12077973" } lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "29.0.13599879-beta2" }
androidx-documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" } androidx-documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" }