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 매우 잘 설명 된 질문입니다. –