我见过的所有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
?
答案 0 :(得分:1)
我认为当你想让它以相反的方式运行时你需要它。
例如,您希望从C / C ++代码创建JVM并调用JVM的方法。
例如,在这里,我们需要链接ljvm,否则你将无法在C代码中找到符号。
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo027