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 per una domanda molto ben descritta. –