此错误是由运行在 32 位 JVM 中的 Java 程序访问的 64 位库引起的吗?

Posted

技术标签:

【中文标题】此错误是由运行在 32 位 JVM 中的 Java 程序访问的 64 位库引起的吗?【英文标题】:Is this error caused by a 64-bit library being accessed by a Java program running in a 32-bit JVM? 【发布时间】:2011-01-31 10:49:17 【问题描述】:

我正在尝试创建一个使用 JNI 调用一些本机函数的简单 Java 应用程序。我已经按照 JNI Programming Guide 中的示例进行操作,但似乎无法让它们工作。我有以下用 Java 编写的 Hello World 程序:

class HelloWorld 
    private native void print();

    public static void main(String [] args) 
        new HelloWorld().print();
    

    static 
        System.load("/home/mike/Desktop/libHelloWorld.so");
    

我使用javac HelloWorld.java 编译它,就像平常一样。

我也有打印功能的 C 实现,在 HelloWorld.c 文件中:

#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj) 
    printf("Hello world!\n");
    return;

然后我运行javah -jni HelloWorld,最后如下:

gcc34 -shared -fpic -o libHelloWorld.so -I/<path to JDK>/include -I/<path to JDK>/include/linux HelloWorld.c

gcc34 是我机器上工作的 GCC 程序的名称(我不控制它),我显然将 JDK 的真实路径放在该命令中。当我使用标准 java HelloWorld 运行我的程序时,我收到一条错误消息:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/mike/Desktop/libHelloWorld.so: /home/mike/Desktop/libHelloWorld.so: wrong ELF class: ELFCLASS64 (Possible causes: architecture word width mismatch)
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1778)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1674)
    at java.lang.Runtime.load0(Runtime.java:770)
    at java.lang.System.load(System.java:1003)
    at HelloWorld.<clinit>(HelloWorld.java:8)
Could not find the main class: HelloWorld. Program will exit.

我知道我正在运行 32 位 JVM(不幸的是,截至目前,我不允许使用 64 位 JVM)。我尝试使用“-m32”选项告诉 GCC 以 32 位模式编译,但我们没有(同样无法获得)我们需要的东西。编辑:我能够将我的文件移动到能够以 32 位模式编译的机器上。所以我这样做了,然后通过运行file libHelloWorld.so 验证了我的 libHelloWorld.so 文件是 32 位的,并得到了ELF32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available。我还运行了java -version 并得到了Java HotSpot(TM) Server VM (build &lt;blah&gt;, mixed mode),所以看起来这个JVM 是在32 位模式下运行的。

为什么我仍然收到此错误?

【问题讨论】:

+1 表示一个描述得很好的问题。 【参考方案1】:

是的:-)。所以不会让我提交一个字的答案,所以这里有一些possibly-useful Google hits。

【讨论】:

感谢您的快速回答。我已经用谷歌搜索过了,只是想确定……如果我们是对的,这意味着我的工作会变得更加困难,哈哈。再次感谢! 我很好奇为什么你不能以某种方式访问​​ 32 位编译器。即使您没有可用的实际硬件,您是否可以使用虚拟机(或 EC2 之类的云)? 如果单词足够长,您可以提交一个单词的答案。威尔士语和德语对此很有用 - 但在 SO 上禁止使用。 看来问题依然存在...见上! 没关系!当我将文件移到可以以 32 位编译的新机器上时,我忘记更改给出 System.load 的路径。我现在就这样做了,它有效。再次感谢马特。

以上是关于此错误是由运行在 32 位 JVM 中的 Java 程序访问的 64 位库引起的吗?的主要内容,如果未能解决你的问题,请参考以下文章

“错误:此 Java 实例不支持 32 位 JVM。” [1] “请安装所需的版本。”

如何在 64 位 JVM 上运行 TeamCity

安装的jvm是64位或32位[重复]

Java 32 位 Xmx 与 Java 64 位 Xmx

强制 64 位 jvm 到 32 位 jvm?

可以通过参数“-d32”强制 64 位 JVM 使用 32 位模式吗?