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
相关产品推荐
相关产品推荐

