You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSVC编译64位程序遇__imp_JNI_GetCreatedJavaVMs未解析外部符号求助

解决MSVC编译64位程序时__imp_JNI_GetCreatedJavaVMs未解析外部符号问题

你已经尝试了不少基础操作,但还是碰到了JNI链接的典型坑,我来给你梳理几个关键的解决方向:

1. 改用函数指针调用(适配手动LoadLibrary的场景)

你已经手动加载了jvm.dll,但如果代码里直接调用JNI_GetCreatedJavaVMs,链接器依然会尝试从导入库中寻找符号——这就是问题核心。你需要通过GetProcAddress获取函数指针,再间接调用,这样链接器就不会再报错了。

另外注意:你代码里的路径用了单反斜杠\,这在C++里会被解析为转义字符,会导致路径识别错误,记得改成双反斜杠\\。

示例代码:

// 先定义和JNI_GetCreatedJavaVMs签名一致的函数指针类型
typedef jint(JNICALL* JNI_GetCreatedJavaVMs_t)(JavaVM**, jsize, jsize*);

HINSTANCE hVM = LoadLibraryA("C:\\Program Files\\Java\\jdk1.8.0_172\\jre\\bin\\server\\jvm.dll");
if (hVM == NULL) {
    // 这里写你的错误处理逻辑
}

// 获取函数地址
JNI_GetCreatedJavaVMs_t pJNI_GetCreatedJavaVMs = 
    (JNI_GetCreatedJavaVMs_t)GetProcAddress(hVM, "JNI_GetCreatedJavaVMs");

if (pJNI_GetCreatedJavaVMs == NULL) {
    // 这里写你的错误处理逻辑
}

// 通过指针调用目标函数
JavaVM* vmList[1];
jsize count = 0;
jint result = pJNI_GetCreatedJavaVMs(vmList, 1, &count);

2. 确保使用64位的jvm.lib导入库

你编译的是64位程序,必须对应64位JDK的导入库:

  • 64位JDK的jvm.lib在JDK根目录\lib\amd64下,根目录的lib文件夹里的是32位库,完全不兼容64位编译目标
  • 把这个amd64路径添加到VC++目录的库目录中,同时在项目属性的「链接器→输入→附加依赖项」里明确写上jvm.lib

3. 验证JDK和编译目标的位数匹配

确认你安装的是64位版本的JDK(jdk1.8.0_172的64位安装包文件名会带有x64标识),32位JDK的库文件根本无法被64位程序链接。

4. 提前处理运行时的DLL路径问题

哪怕编译通过了,运行时也要确保程序能找到jvm.dll:可以把C:\Program Files\Java\jdk1.8.0_172\jre\bin\server添加到系统PATH环境变量,或者临时把jvm.dll复制到程序输出目录(前者是更规范的做法)。

内容的提问来源于stack exchange,提问作者Vellety

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:58:02