Я пытаюсь создать простое Java-приложение, которое использует JNI для вызова некоторых собственных функций. Я следовал примерам в Руководстве по программированию JNI и не могу заставить их работать. У меня есть следующая программа Hello World, написанная на Java:
class HelloWorld {
private native void print();
public static void main(String [] args) {
new HelloWorld().print();
}
static {
System.load("/home/mike/Desktop/libHelloWorld.so");
}
}
Я компилирую, используя javac HelloWorld.java
, как обычно.
У меня также есть реализация C функции print в файле HelloWorld.c:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj) {
printf("Hello world!\n");
return;
}
Затем я запускаю javah -jni HelloWorld
и, наконец, следующее:
gcc34 -shared -fpic -o libHelloWorld.so -I/<path to JDK>/include -I/<path to JDK>/include/linux HelloWorld.c
gcc34 - это имя программы 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 компилировать в 32-битном режиме, используя опцию "-m32", но у нас нет (и опять же, не можем получить) того, что нам нужно для этого. РЕДАКТИРОВАТЬ: я смог переместить мои файлы на машину, способную компилировать в 32-разрядном режиме. Итак, я сделал это, затем проверил, что мой файл libHelloWorld.so был 32-битным, запустив file libHelloWorld.so
и получив 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-битном режиме.
Почему я все еще получаю эту ошибку?