manager: Updated dependency library version
- Add JNI macros to simplify field setup and object creation
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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" }
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user