linux 64bit - jni链接错误

时间:2015-04-05 15:42:47

标签: java c linux java-native-interface 64-bit

我试图找到一个在ubuntu 64bit上使用JNI从C调用Java的工作示例。
代码来自:calling java function from c using 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,则会出现此错误:

test.o: In function `create_vm':
test.c:(.text+0x35): undefined reference to `JNI_CreateJavaVM'
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分: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,{{3} })使用它。