c++ - 从 jvm.dll 获取 FindClass 函数指针

标签 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 函数指针的帮助都会有所帮助。谢谢:)

最佳答案

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

关于c++ - 从 jvm.dll 获取 FindClass 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51413214/

相关文章:

java - 如何处理参数中的空格?

c++ - 无法连接到套接字

.net - 在哪里可以找到 Visual Studio 2015 的 wsdl.exe?

使用 contribute_world 编译 opencv_world 时 opencv3.2 build on vs2017 报错

c++ - g++ Cygwin/Linux 或版本差异

c++ - GetOpenFileName 触发断点

c++ - NCurses 中有获取窗口位置的函数吗?

c++ - 我们如何有效地将平面图像转换为交错图像 (C++)?

windows - 在运行提升的 session 时加载不同的 powershell 配置文件的技术是什么

c++ - 为什么 Visual Studio 不允许我在 enable_if 中使用模板化的 constexpr 函数?