我试图找到一个在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
答案 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} })使用它。