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

7

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

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 <blah>, mixed mode),因此似乎此JVM正在以32位模式运行。

为什么我仍然会收到这个错误?


1
非常好的问题描述,点赞! - Matt Solnit
1个回答

1

谢谢你的快速回答。我已经在谷歌上搜索过了,只是想确认一下...如果我们是正确的,那么我的工作将会变得更加困难,哈哈。再次感谢! - Mike
我非常好奇为什么你无法获得32位编译器的访问权限。即使你没有实际的硬件可用,你可以使用虚拟机(或类似EC2的云服务)吗? - Matt Solnit
如果一个单词足够长,你可以提交一个单词的答案。威尔士语和德语对此很有用 - 但在SO上是被禁止的。 - Jonathan Leffler
问题似乎仍然存在...请参见上面! - Mike
没事了!当我把文件移动到可以编译32位的新机器上时,我忘记改变System.load给出的路径。现在我已经改正了,它可以工作了。再次感谢Matt。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接