2010-03-24 7 views
7

Sto provando a creare una semplice app Java che utilizza JNI per chiamare alcune funzioni native. Ho seguito gli esempi nella Guida alla programmazione JNI e non riesco a farli funzionare. Ho il seguente programma Ciao Mondo, scritto in Java:Questo errore è causato da una libreria a 64 bit a cui accede un programma Java in esecuzione in una JVM a 32 bit?

class HelloWorld { 
    private native void print(); 

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

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

compilo usando javac HelloWorld.java, proprio come normale.

Ho anche l'implementazione C della funzione di stampa, nel file 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; 
} 

Poi corro javah -jni HelloWorld, e, infine, il seguente:

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

gcc34 è il nome del programma GCC sulla mia macchina qui al lavoro (non lo controllo) e ovviamente inserisco il vero percorso del JDK in quel comando. Quando eseguo il mio programma, utilizzando lo standard java HelloWorld, ottengo un errore che dice quanto segue:

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. 

so che sto correndo a 32 bit JVM (e purtroppo, che fin da oggi, non sono permesso di ottenere una JVM a 64 bit). Ho provato a dire a GCC di compilare in modalità a 32 bit usando l'opzione "-m32", ma non abbiamo (e di nuovo, non possiamo ottenere) ciò di cui abbiamo bisogno. EDIT: sono stato in grado di spostare i miei file su una macchina in grado di compilare in modalità a 32 bit. Così l'ho fatto, quindi ho verificato che il mio file libHelloWorld.so era a 32 bit eseguendo file libHelloWorld.so e ottenuto ELF32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available. Ho anche eseguito java -version e ottenuto Java HotSpot(TM) Server VM (build <blah>, mixed mode) quindi sembra che questa JVM sia in esecuzione in modalità a 32 bit.

Perché ricevo ancora questo errore?

+1

+1 per una domanda molto ben descritta. –

risposta

1

Yup :-). SO non mi consente di inviare una risposta di una sola parola, quindi ecco alcuni possibly-useful Google hits.

+0

Grazie per la risposta rapida. L'ho già cercato su Google e volevo solo assicurarmi che ... se abbiamo ragione, significa che il mio lavoro diventerà molto più difficile, haha. Grazie ancora! – Mike

+0

Sono molto curioso del fatto che tu non sia in grado in qualche modo di accedere a un compilatore a 32 bit. Anche se non hai l'hardware disponibile, potresti usare una macchina virtuale (o un cloud come EC2)? –

+0

È a causa della politica del lavoro. Terribilmente fastidioso – Mike

Problemi correlati