Linux 64bit - JNI ошибка соединения

1

Я пытаюсь получить рабочий пример вызова Java с C, используя JNI на ubuntu 64bit.
Код из: вызов java-функции из c с помощью jni. Я компилирую, используя:

gcc test.c -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/linux -c
gcc test.o -L/usr/lib/jvm/java-1.7.0-openjdk/amd64/jre/lib/amd64/server/ -ljvm -o jniTest

Это не генерирует никаких ошибок, но если я попробую ldd jniTest я получаю следующее:

linux-vdso.so.1 =>  (0x00007fffe55d5000)
libjvm.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f85f2928000)
/lib64/ld-linux-x86-64.so.2 (0x00007f85f2d0a000)

И если я попытаюсь ./jniTest он даст ./jniTest ошибку:

test.o: In function 'create_vm':
test.c:(.text+0x35): undefined reference to 'JNI_CreateJavaVM'
collect2: error: ld returned 1 exit status
Теги:
64bit
jni

1 ответ

0

С помощью -L/usr/lib/jvm/java-1.7.0-openjdk/amd64/jre/lib/amd64/server/ вы сообщите компоновщику, где найти libjvm.so. Во время выполнения вам нужно будет сделать то же самое (http://linux.die.net/man/8/ld.so). И вам также понадобится родительский каталог, потому что там есть другие необходимые библиотеки. Один из способов сделать это - указать его в командной строке: LD_LIBRARY_PATH=/usr/lib/jvm/java-1.7.0-openjdk/amd64/jre/lib/amd64/server: /usr/lib/jvm/java-1.7.0-openjdk/amd64/jre/lib/amd64./jniTest.

Способ обойти необходимость указывать путь - не ссылаться на libjvm.so вообще, а находить его во время выполнения, а затем использовать функции в dlfcn.h(http://linux.die.net/man/3/dlopen, http://linux.die.net/man/3/dlsym), чтобы использовать его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню