libjvm.so:要链接还是不链接?

时间:2017-06-06 10:25:57

标签: java linker java-native-interface shared-libraries

我见过的所有JNI指南(例如JNI runtime linking)都建议我将JNI库链接到libjvm.so

$ gcc -I${JAVA_HOME}/include -c -o test.o test.c
$ gcc -shared -o libtest.so test.o -L${JAVA_HOME}/jre/lib/i386/server -Wl,-rpath,${JAVA_HOME}/jre/lib/i386/server -ljvm

如果我的自定义库是用C ++编写的并使用C ++ JNI API,我可以在nm -C输出中清楚地看到相应的弱符号:

00000690 W JNIEnv_::ThrowNew(_jclass*, char const*)
00000672 W JNIEnv_::FindClass(char const*)

但是,如果我在命令行上提及-ljvm,自定义本机库继续正常工作,可能是因为libjvm.so自动加载< strong>任何 Java进程。

你可以告诉我何时绝对需要明确链接libjvm.so

1 个答案:

答案 0 :(得分:1)

我认为当你想让它以相反的方式运行时你需要它。

例如,您希望从C / C ++代码创建JVM并调用JVM的方法。

例如,在这里,我们需要链接ljvm,否则你将无法在C代码中找到符号。

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo027