如何编译C语言编写的64位DLL?适配Java本地调用场景
编译64位JNI DLL的解决方案
我来帮你搞定这个64位DLL编译的问题,其实核心就是切换MSVC的编译目标架构,下面是一步步的操作指南:
1. 确保使用64位MSVC工具链
首先,你得用64位版本的Visual C++编译器工具链。最简单的方式是打开Visual Studio安装的x64 Native Tools Command Prompt(在开始菜单的Visual Studio文件夹里能找到),这个命令提示符已经配置好了64位编译所需的所有环境变量,避免手动配置出错。
2. 修改编译命令
你原来的命令有两个小问题:一是路径参数的语法错误(第二个包含目录的/"应该是/I "),二是没有指定64位目标架构,且使用了旧的32位运行时选项。修改后的命令如下:
cl /I "java-path/include" /I "java-path/include/win32" /DL /MD Main.c /FeTest.dll /link /MACHINE:X64
参数说明:
/I "java-path/include"和/I "java-path/include/win32":正确指定JNI头文件的包含目录,注意替换java-path为你64位JDK的实际安装路径。/DL:定义预处理器宏L(应该是你的代码需要的,保留即可)。/MD:使用多线程DLL版本的C运行时库(现代推荐用法,如果你需要静态链接运行时,可以换成/MT),替换了你原来的-ML(旧的32位单线程静态库选项,不适用于64位编译)。/FeTest.dll:指定输出的DLL文件名。/link /MACHINE:X64:明确告诉链接器生成64位目标文件,确保不会因为工具链歧义生成32位DLL。
3. 额外注意事项
- 匹配Java架构:你的Java程序必须使用64位JDK运行,32位JVM无法加载64位DLL,反之亦然。确保你用的是64位的
java.exe来运行程序。 - 验证DLL架构:编译完成后,可以用
dumpbin /headers Test.dll命令查看输出,在FILE HEADER VALUES里找machine (x64)来确认是64位DLL。
内容的提问来源于stack exchange,提问作者c0degreen
相关产品推荐
相关产品推荐

