2010-03-24 21 views
7

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

+1. –

cevap

1

Yup :-). SO, tek kelimelik bir cevap göndermeme izin vermiyor, bu yüzden burada possibly-useful Google hits var. Çok iyi tanımlanmış bir soru için

+0

Hızlı cevap için teşekkürler. Zaten Google Dokümanı yaptım ve sadece emin olmak istedim ... eğer haklıysak, bu benim işimin çok daha zorlaşacağı anlamına geliyor, haha. Tekrar teşekkürler! – Mike

+0

Neden 32 bitlik bir derleyiciye erişim sağlayamadığınızı merak ediyorum. Mevcut donanımınız olmasa bile, bir sanal makine (veya EC2 gibi bir bulut) kullanabilir misiniz? –

+0

Bu iş politikaları yüzünden. Korkunç can sıkıcı. – Mike

İlgili konular