是否由在32位JVM中运行的Java程序访问64位库导致此错误?

Mik*_*ike 7 c java java-native-interface jvm 32bit-64bit

我正在尝试创建一个简单的Java应用程序,它使用JNI来调用一些本机函数.我已经按照JNI编程指南中的示例进行了操作,似乎无法使它们工作.我有以下用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

javac HelloWorld.java正常使用它编译它.

我还在HelloWorld.c文件中有print函数的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;
}
Run Code Online (Sandbox Code Playgroud)

然后我跑javah -jni HelloWorld,最后是以下:

gcc34 -shared -fpic -o libHelloWorld.so -I/<path to JDK>/include -I/<path to JDK>/include/linux HelloWorld.c
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*nit 1

是的 :-)。所以不允许我提交一个单词的答案,所以这里有一些可能有用的谷歌点击