2010-03-24 1 views
7

Ich versuche eine einfache Java-App zu erstellen, die JNI verwendet, um einige native Funktionen aufzurufen. Ich habe die Beispiele im JNI-Programmierleitfaden befolgt und kann sie scheinbar nicht zum Laufen bringen. Ich habe folgendes Hallo Welt Programm in Java geschrieben:Wird dieser Fehler von einer 64-Bit-Bibliothek verursacht, auf die von einem Java-Programm zugegriffen wird, das in einer 32-Bit-JVM ausgeführt wird?

class HelloWorld { 
    private native void print(); 

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

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

ich es javac HelloWorld.java kompilieren verwenden, genau wie normal.

Ich habe auch die C Implementierung der Druckfunktion, in der HelloWorld.c Datei:

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

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

Dann laufe ich javah -jni HelloWorld und schließlich folgendes:

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

GCC34 der Name des GCC-Programms auf meiner Maschine hier bei der Arbeit (ich kontrolliere das nicht) und ich lege offensichtlich den realen Pfad zum JDK in diesem Befehl. Wenn ich mein Programm ausführen, die Standard-java HelloWorld verwenden, erhalte ich eine Fehlermeldung, die folgenden:

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. 

Ich weiß, ich bin eine 32-Bit-JVM (und leider, wie der gerade jetzt, ich bin nicht erlaubt, eine 64-Bit-JVM zu bekommen). Ich habe versucht, GCC im 32-Bit-Modus mit der Option "-m32" zu kompilieren, aber wir haben (und wieder, können nicht bekommen), was wir dafür brauchen. EDIT: Ich konnte meine Dateien auf eine Maschine verschieben, die im 32-Bit-Modus kompilieren kann. Also habe ich das getan, dann überprüft, dass meine libHelloWorld.so-Datei 32-Bit war, indem sie file libHelloWorld.so runnning und ELF32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available bekam. Ich lief auch java -version und bekam Java HotSpot(TM) Server VM (build <blah>, mixed mode) so scheint es, dass JVM im 32-Bit-Modus läuft.

Warum bekomme ich immer noch diesen Fehler?

+1

+1 für eine sehr gut beschriebene Frage. –

Antwort

1

Yup :-). SO lässt mich nicht eine Ein-Wort-Antwort einreichen, also hier sind einige possibly-useful Google hits.

+0

Danke für die schnelle Antwort. Ich habe es bereits gegoogelt und wollte nur sichergehen ... wenn wir recht haben, bedeutet dies, dass mein Job viel härter wird, haha. Danke noch einmal! – Mike

+0

Ich bin sehr neugierig, warum Sie nicht irgendwie auf einen 32-Bit-Compiler zugreifen können. Auch wenn Sie nicht über die tatsächliche Hardware verfügen, können Sie eine virtuelle Maschine (oder eine Cloud wie EC2) verwenden? –

+0

Es ist wegen der Arbeitspolitik. Sehr nervig. – Mike

Verwandte Themen