【问题标题】:libjvm.so: to link or not to link?libjvm.so:链接还是不链接?
【发布时间】:2017-06-06 10:25:56
【问题描述】:

我见过的所有 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 会被any Java 进程。

你能告诉我什么时候绝对需要明确链接libjvm.so吗?

【问题讨论】:

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


    【解决方案1】:

    我认为当你希望它反过来运行时你需要它。

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

    比如这里,我们需要用ljvm链接,否则你的C代码里找不到符号。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多