LSPlant/lsplant/src/main/jni/art/thread.hpp
2022-03-11 19:37:11 +08:00

47 lines
1.1 KiB
C++

#pragma once
#include "common.hpp"
namespace lsplant::art {
class Thread {
struct ObjPtr {
void *data;
};
CREATE_MEM_FUNC_SYMBOL_ENTRY(ObjPtr, DecodeJObject, Thread *thiz, jobject obj) {
if (DecodeJObjectSym)
return DecodeJObjectSym(thiz, obj);
else
return {.data = nullptr};
}
CREATE_FUNC_SYMBOL_ENTRY(Thread *, CurrentFromGdb) {
if (CurrentFromGdbSym) [[likely]]
return CurrentFromGdbSym();
else
return nullptr;
}
public:
static Thread *Current() { return CurrentFromGdb(); }
static bool Init(const HookHandler &handler) {
if (!RETRIEVE_MEM_FUNC_SYMBOL(DecodeJObject, "_ZNK3art6Thread13DecodeJObjectEP8_jobject")) {
return false;
}
if (!RETRIEVE_FUNC_SYMBOL(CurrentFromGdb, "_ZN3art6Thread14CurrentFromGdbEv")) {
return false;
}
return true;
}
void *DecodeJObject(jobject obj) {
if (DecodeJObjectSym) [[likely]] {
return DecodeJObject(this, obj).data;
}
return nullptr;
}
};
} // namespace lsplant::art