从jvm.dll获取FindClass函数指针

时间:2018-07-19 01:47:54

标签: c++ windows visual-studio-2015 java-native-interface jnienv

我试图在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 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函数指针的任何帮助将很有帮助。谢谢:)

1 个答案:

答案 0 :(得分:0)

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