正在从jvm.dll获取FindClass函数指针

Getting the FindClass function pointer from jvm.dll

本文关键字:FindClass 函数 指针 获取 dll jvm      更新时间:2023-10-16

我正试图在jvm.dll中获取指向FindClass方法的函数指针。现在,我成功地用JNI_CreateJVM方法做了类似的事情,但FindClass不起作用。

class JVMInitializer {
public:
static JVMInitializer* getInstance();
static void destroyJVM();
static HMODULE m_jvm_dll;
static JavaVM *m_pJvm;                      
static JNIEnv *m_pEnv;                      
static JavaVMInitArgs m_VMargs;
static decltype(&JNI_CreateJavaVM) m_createJVM_Ptr;     
static decltype(&JNIEnv::FindClass) m_FindClass_Ptr;

private:
static JVMInitializer* m_pJVMInstance;              
JVMInitializer() {};
~JVMInitializer() {};
JVMInitializer(JVMInitializer const&);
JVMInitializer& operator=(JVMInitializer const&);
static char JVMInitializer::getPathSeparator();
bool static create_JVM();
};

然后在create_JVM((方法中,我这样做:

m_createJVM_Ptr = (decltype(&JNI_CreateJavaVM))GetProcAddress(m_jvm_dll, "JNI_CreateJavaVM");
m_FindClass_Ptr = (decltype(&JNIEnv::FindClass))GetProcAddress(m_jvm_dll, "FindClass");

第一个方法有效,程序能够成功地找到并调用JNI_CreateJVM方法,但我在m_FindClass_Ptr中遇到了编译错误。我的猜测是,我错误地调用了findclass的GetProcAddress,因为它实际上是jni.h中JNIEnv_ struct中的一个方法(我可能错了(。

struct JNIEnv_ {
const struct JNINativeInterface_ *functions;
#ifdef __cplusplus
jint GetVersion() {
return functions->GetVersion(this);
}
jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
jsize len) {
return functions->DefineClass(this, name, loader, buf, len);
}
jclass FindClass(const char *name) {
return functions->FindClass(this, name);
}
......

任何有关加载FindClass函数指针的帮助都将非常有用。谢谢:(

是的,JNI_CreateJavaVM是实际导出的函数,但FindClass不是。FindClass是JNIEnv结构中成员的名称,VM在创建env时会将该成员初始化为函数指针。