LSPosed/edxp-core/jni/main/include/riru.c

76 lines
2.3 KiB
C

#include <dlfcn.h>
#include <memory.h>
#include <include/logging.h>
#ifdef __LP64__
#define LIB "/system/lib64/libmemtrack.so"
#else
#define LIB "/system/lib/libmemtrack.so"
#endif
static void *riru_handle;
static char *riru_module_name;
static void *get_handle() {
if (riru_handle == NULL)
riru_handle = dlopen(LIB, RTLD_NOW | RTLD_GLOBAL);
return riru_handle;
}
const char *riru_get_module_name() {
return riru_module_name;
}
void riru_set_module_name(const char *name) {
riru_module_name = strdup(name);
}
int riru_get_version() {
static void **sym;
void *handle;
if ((handle = get_handle()) == NULL) return -1;
if (sym == NULL) sym = dlsym(handle, "riru_get_version");
if (sym) return ((int (*)()) sym)();
return -1;
}
void *riru_get_func(const char *name) {
static void **sym;
void *handle;
if ((handle = get_handle()) == NULL) return NULL;
if (sym == NULL) sym = dlsym(handle, "riru_get_func");
if (sym) return ((void *(*)(const char *, const char *)) sym)(riru_get_module_name(), name);
return NULL;
}
void *riru_get_native_method_func(const char *className, const char *name, const char *signature) {
static void **sym;
void *handle;
if ((handle = get_handle()) == NULL) return NULL;
if (sym == NULL) sym = dlsym(handle, "riru_get_native_method_func");
if (sym)
return ((void *(*)(const char *, const char *, const char *, const char *)) sym)(
riru_get_module_name(), className, name, signature);
return NULL;
}
void riru_set_func(const char *name, void *func) {
static void **sym;
void *handle;
if ((handle = get_handle()) == NULL) return;
if (sym == NULL) sym = dlsym(handle, "riru_set_func");
if (sym)
((void *(*)(const char *, const char *, void *)) sym)(riru_get_module_name(), name, func);
}
void riru_set_native_method_func(const char *className, const char *name, const char *signature,
void *func) {
static void **sym;
void *handle;
if ((handle = get_handle()) == NULL) return;
if (sym == NULL) sym = dlsym(handle, "riru_set_native_method_func");
if (sym)
((void *(*)(const char *, const char *, const char *, const char *, void *)) sym)(
riru_get_module_name(), className, name, signature, func);
}