Bazı yerel işlevleri çağırmak için JNI kullanan basit bir Java uygulaması oluşturmaya çalışıyorum. JNI Programlama Kılavuzu'ndaki örnekleri takip ettim ve onları çalışmaya başaramadılar. Ben sadece normal gibi javac HelloWorld.java
kullanarak derlemek32 bit JVM'de çalışan bir Java programıyla erişilen 64 bit kitaplıktan kaynaklanan bu hata mı?
class HelloWorld {
private native void print();
public static void main(String [] args) {
new HelloWorld().print();
}
static {
System.load("/home/mike/Desktop/libHelloWorld.so");
}
}
: Java ile yazılmış aşağıdaki Merhaba Dünya programı yapıyoruz.
gcc34 -shared -fpic -o libHelloWorld.so -I/<path to JDK>/include -I/<path to JDK>/include/linux HelloWorld.c
gcc34 adıdır: Sonra aşağıdaki javah -jni HelloWorld
ve son olarak çalıştırmak
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj) {
printf("Hello world!\n");
return;
}
:
Ben de helloworld.c dosyasında, baskı fonksiyonunun C uygulaması var GCC programının işte çalıştığı makinede (bunu kontrol etmiyorum) ve açık bir şekilde bu komutta JDK'ya gerçek yolu yerleştiriyorum. Ben standart java HelloWorld
kullanarak, benim programı çalıştırdığınızda, aşağıdaki söyleyerek bir hata alıyorum:
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.
Ben koşuyorum biliyorum 32 bit JVM (ve ne yazık ki, şu anda itibariyle, değilim 64 bit JVM almasına izin verildi). GCC'ye "-m32" seçeneğini kullanarak 32-bit modda derlemeyi denedim, ancak bunun için neye ihtiyacımız yok (ve tekrar edemeyiz). DÜZENLEME: Dosyalarımı 32 bit modunda derleyebilen bir makineye taşıyabildim. Bunu yaptım, sonra libHelloWorld.so dosyamın file libHelloWorld.so
runnning ile 32-bit olduğunu ve ELF32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available
aldığını doğruladım. Aynı zamanda java -version
'u çalıştırdım ve Java HotSpot(TM) Server VM (build <blah>, mixed mode)
aldım, bu yüzden bu JVM 32-bit modunda çalışıyor.
Neden hala bu hatayı alıyorum?
+1. –