libjvm.so:去 link 还是不去 link?
libjvm.so: to link or not to link?
我见过的所有 JNI 指南(例如 JNI runtime linking)都建议我 link 我的 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
由 any Java 进程自动加载。
你能告诉我什么时候 绝对 有必要明确 link 反对 libjvm.so
吗?
我认为你需要它的时候就需要它运行反之亦然。
例如,您想从 C/C++ 代码创建 JVM 并调用 JVM 的方法。
比如这里,我们需要link用ljvm,否则你的C代码里找不到符号。
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo027
我见过的所有 JNI 指南(例如 JNI runtime linking)都建议我 link 我的 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
由 any Java 进程自动加载。
你能告诉我什么时候 绝对 有必要明确 link 反对 libjvm.so
吗?
我认为你需要它的时候就需要它运行反之亦然。
例如,您想从 C/C++ 代码创建 JVM 并调用 JVM 的方法。
比如这里,我们需要link用ljvm,否则你的C代码里找不到符号。
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo027