64位系统上的Java Native Interface 32位dll

Fra*_*ver 28 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)`
Run Code Online (Sandbox Code Playgroud)

在使用Java Native Interface时,我遇到了一个产生此错误的问题.我相信这是因为我使用MinGW编译了.dll,它编译成32位.dll而我的系统是64位,因此我的Java运行在64位.反正有没有迫使我的Java以32位运行?

Jav*_*a42 27

您必须安装32位JVM,您才能运行代码.

如果要分发应用程序,则需要构建DLL的32位和64位版本.然后使用以下技术加载正确的DLL,无论您的客户是否拱门.在生成的输出文件中附加32或64(MyJniDLL32.dll和MyJniDLL64.dll).

    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);
Run Code Online (Sandbox Code Playgroud)

  • 我不同意.我构建32位DLL并运行32位JVM,在64位操作系统上都可以.此外,他的跟踪显示了java.lang.System.loadLibrary,因此JVM正在加载dll.JNI DLL 32与64需要匹配JVM 32与64. (4认同)

小智 8

只是说明显而易见:要加载为32位架构构建的本机库,必须强制JVM以32位模式启动.

java -d32 ...
Run Code Online (Sandbox Code Playgroud)

可能您需要为您的平台安装较旧的JVM(例如,OS X上的Oracle Java 7仅为64位,您需要从其知识库中获取Apple的Java 6).