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 für eine sehr gut beschriebene Frage. –