Причиной этой ошибки является доступ к 64-битной библиотеке программой Java, работающей в 32-битной JVM? - PullRequest
7 голосов
/ 24 марта 2010

Я пытаюсь создать простое 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 функции print в файле 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). Я пытался сказать GCC компилировать в 32-битном режиме, используя опцию "-m32", но у нас нет (и опять же, не можем получить) того, что нам нужно для этого. РЕДАКТИРОВАТЬ: я смог переместить мои файлы на машину, способную компилировать в 32-разрядном режиме. Итак, я сделал это, затем проверил, что мой файл libHelloWorld.so был 32-битным, запустив file libHelloWorld.so и получив 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 Ответ

1 голос
/ 24 марта 2010

Да :-). ТАК не разрешите мне отправить ответ одним словом, так что вот несколько , возможно, полезных Google хитов .

...