64 位系统上的 Java native 接口(interface) 32 位 dll

标签 java dll java-native-interface mingw

E:\Code\Java\JNITest>java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.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 test.main(test.java:16)`

在使用 Java 原生接口(interface)时,我遇到了一个导致此错误的问题。我相信这是因为我用 MinGW 编译了 .dll,它编译为 32 位 .dll,而我的系统是 64 位的,因此我的 Java 运行在 64 位。 有没有办法强制我的 Java 以 32 位运行?

最佳答案

您必须安装 32 位 JVM,然后才能运行您的代码。

如果您要分发您的应用程序,您将需要构建 32 位和 64 位版本的 DLL。然后使用以下技术来加载正确的 DLL,而不管您的客户拱形如何。将 32 或 64(MyJniDLL32.dll 和 MyJniDLL64.dll)附加到生成的输出文件中。

    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);

关于64 位系统上的 Java native 接口(interface) 32 位 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9757456/

相关文章:

java - 是否需要在fragment onActivityCreated 方法中检查父 Activity 是否为空?

mysql - 部署 C# 控制台应用程序时如何包含 MySql.Data.dll

c++ - 如何在 Borland C++ 中使用 .NET 类

java - 在 Java 中使用 C++ 函数

java - 从 JNI GetByteArrayElements 调用中提取字符串

java - 在 STS Gradle 中禁用打印 stracktrace/BuildException 输出

java - 创建枚举的父类(super class)

java - 如何在 Kafka 集成测试中通过发送消息来设置应用程序状态?

c# - 在mysql更新查询中使用c# datetime

java - JNI - 捕获异常并检查其类型