【问题标题】:Java JNI - Can't load IA 32-bit .dll on a AMD 64-bit platformJava JNI - 无法在 AMD 64 位平台上加载 IA 32 位 .dll
【发布时间】:2017-09-12 06:00:56
【问题描述】:

我尝试使用this tutorial. 创建一个 JNI helloworld 项目 我完成了页面上的每一步。不幸的是,在尝试使用 java -Djava.library.path="C:/Users/Philipp/Desktop/jni" HelloWorld 调用程序后,我收到以下错误消息:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\Philipp\Desktop\jni\helloworld.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at HelloWorld.<clinit>(HelloWorld.java:3)

在 stackoverflow 上有一些关于此类错误的问题,不幸的是,没有一个解决方案对我有用。

我想继续使用 JDK 64 位,所以我想我必须为 64 位机器编译我的 C 代码。我尝试使用 -m64 关键字:gcc -shared HelloWorld.c -I"C:/Program Files/Java/jdk1.8.0_121/include" -I"C:/Program Files/Java/jdk1.8.0_121/include/win32" -o libhelloworld.dll -m64 导致以下错误:

HelloWorld.c:1:0: sorry, unimplemented: 64-bit mode not compiled in
 #include <jni.h>
 ^

我必须做些什么才能让它运行?

【问题讨论】:

    标签: java c dll java-native-interface


    【解决方案1】:

    你需要一个 x86_64 GCC 工具链来为 x64 编译它(如果你在 Windows 中,可能是 mingw)。你是对的,因为你的 JDK 是 AMD64,所以 SO/DLL 也需要是 AMD64。

    在 Windows 中,您可以通过 cygwin env 或 msys2 安装 x86_64-w64-mingw32- 工具链,或者使用 Microsoft C 编译器。

    【讨论】:

    • 到目前为止我只使用 Java 编程,所以我对整个 C 世界还是很陌生。我已经用 cygwin 下载了工具链,并在 C:\cygwin64 上有一个文件夹,在 C:\cygwin64\bin 中有很多 exe 文件。使用 cygwin64 编译我的 .c 文件需要做什么?
    • 再次运行 cygwin 设置。一旦显示可用的包,选择 x86_64-w64-mingw32 工具链和包。另一个解决方案是 msys2,它带有更简单的东西和 pacman,它是小菜一碟。注意 cygwin 本身不是编译器!但它带有GCC 工具链。 C-world 太棒了,亲爱的,只是需要一些时间来相处,你就是完美的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多