Я пытаюсь получить рабочий пример вызова 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
С помощью -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), чтобы использовать его.