如何在加载 DLL 时加载 JVM 并在卸载 DLL 时释放它

发布于 2024-12-16 19:26:10 字数 88 浏览 0 评论 0原文

我正在开发一个 dll,它调用一个 jar 通过 JNI 完成大部分工作。如何创建 DLL,使其在加载 DLL 时仅创建一次 JVM,并在卸载 DLL 时释放它?

I'm developing a dll which invokes a jar to do most of the work through JNI. How can I create the DLL such that it creates the JVM only one time when the DLL is loaded and frees it when the DLL is unloaded?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不即不离 2024-12-23 19:26:10

提供一个 DllMain 函数,其模式如下:

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved)     // reserved
{
    // Perform actions based on the reason for calling.
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // Initialize once for each new process.
            // Return FALSE to fail DLL load.
            LOAD_JVM(); // <-----------------------------------------
            break;
        case DLL_THREAD_ATTACH:
            // Do thread-specific initialization.
            break;
        case DLL_THREAD_DETACH:
            // Do thread-specific cleanup.
            break;
        case DLL_PROCESS_DETACH:
            // Perform any necessary cleanup.
            UNLOAD_JVM(); // <-----------------------------------------
            break;
    }
    // Successful DLL_PROCESS_ATTACH.
    return TRUE;
}

Provide a DllMain function, patterned after this:

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved)     // reserved
{
    // Perform actions based on the reason for calling.
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // Initialize once for each new process.
            // Return FALSE to fail DLL load.
            LOAD_JVM(); // <-----------------------------------------
            break;
        case DLL_THREAD_ATTACH:
            // Do thread-specific initialization.
            break;
        case DLL_THREAD_DETACH:
            // Do thread-specific cleanup.
            break;
        case DLL_PROCESS_DETACH:
            // Perform any necessary cleanup.
            UNLOAD_JVM(); // <-----------------------------------------
            break;
    }
    // Successful DLL_PROCESS_ATTACH.
    return TRUE;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文