2010-03-24 1 views
7

JNI를 사용하여 일부 기본 함수를 호출하는 간단한 Java 응용 프로그램을 만들려고합니다. 필자는 JNI 프로그래밍 가이드의 예제를 따라했으며 작동하지 못하는 것 같습니다. 나는 그냥 정상처럼 javac HelloWorld.java를 사용하여 컴파일이 오류는 32 비트 JVM에서 실행되는 Java 프로그램이 64 비트 라이브러리에 액세스하여 발생합니까?

class HelloWorld { 
    private native void print(); 

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

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

: 나는 자바로 작성된 다음의 Hello World 프로그램을 가지고있다.

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

gcc34가 이름입니다 : 그럼 난 다음 javah -jni HelloWorld, 그리고 마지막으로 실행

#include <jni.h> 
#include <stdio.h> 
#include "HelloWorld.h" 

JNIEXPORT void JNICALL 
Java_HelloWorld_print(JNIEnv *env, jobject obj) { 
    printf("Hello world!\n"); 
    return; 
} 

:

나는 또한 HelloWorld.c 파일, 인쇄 기능의 C 구현이 여기 내 직장에서 GCC 프로그램의 (나는 그것을 제어하지 않는다) 그리고 분명히 그 명령에 JDK의 실제 경로를 배치합니다. 나는 표준 java HelloWorld를 사용하여 내 프로그램을 실행하면, 나는 다음과 같은 말을 오류가 :

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. 

내가 실행 해요 알을 32 비트 JVM (불행하게도, 지금의로, 아니에요 64 비트 JVM을 얻을 수 있음). GCC에 "-m32"옵션을 사용하여 32 비트 모드로 컴파일하려했지만, 우리가 필요로하는 것을 갖지 못했습니다. 편집 : 32 비트 모드로 컴파일 할 수있는 컴퓨터로 파일을 이동할 수있었습니다. 그래서 저는 libHelloWorld.so 파일이 file libHelloWorld.so을 실행하여 32 비트 였고 ELF32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available을 얻었음을 확인했습니다. 또한 java -version을 실행하고 Java HotSpot(TM) Server VM (build <blah>, mixed mode)을 얻었으므로이 JVM이 32 비트 모드로 실행되고있는 것처럼 보입니다.

왜 아직도 오류가 발생합니까?

+1

+1 매우 잘 설명 된 질문입니다. –

답변

1

넵 :-). 그래서 한 단어로 된 대답을 제출하게하지 않으니, 여기는 possibly-useful Google hits입니다.

+0

빠른 답변 주셔서 감사합니다. 나는 이미 그것을 봤고, 단지 우리가 옳다면, 내 직업이 훨씬 더 어려워 질 것이라는 것을 확신하고 싶었다. 하하. 다시 한 번 감사드립니다! – Mike

+0

왜 32 비트 컴파일러에 액세스 할 수 없는지 궁금합니다. 실제 하드웨어를 사용할 수 없어도 가상 머신 (또는 EC2와 같은 클라우드)을 사용할 수 있습니까? –

+0

그것은 일 정치 때문입니다. 어색한 성가신. – Mike

관련 문제