使用两个带有Java JNI接口的动态库时出现的问题

使用两个带有Java JNI接口的动态库时出现的问题,java,c++,java-native-interface,g++,ld,Java,C++,Java Native Interface,G++,Ld,我有一个JNI库“lib.so”,它依赖于“lib2.so”。当我在另一个平台上使用lib2.so进行静态编译时,一切正常,但在动态编译时,我得到了一个不满意的link错误。特别是,它说“lib.so:未定义的符号:mysymbol_name”。我已经使用nm工具验证了mysymbol_名称在“lib2.so”中。我还在“lib.so”之前将“lib2.so”加载到Java中 Java代码: System.load("/pathto/lib2.so"); // no error System.l

我有一个JNI库“lib.so”,它依赖于“lib2.so”。当我在另一个平台上使用lib2.so进行静态编译时,一切正常,但在动态编译时,我得到了一个不满意的link错误。特别是,它说“lib.so:未定义的符号:mysymbol_name”。我已经使用nm工具验证了mysymbol_名称在“lib2.so”中。我还在“lib.so”之前将“lib2.so”加载到Java中

Java代码:

System.load("/pathto/lib2.so"); // no error
System.load("/pathto/lib.so"); // triggers UnsatisfiedLinkError
C++编译阶段

g++ -c -fPIC {{{.cpp files}}} {{-I,-L directives}}  --std=c++11 -Wl,-soname,lib2.so
C++链接阶段

g++ {-L,-I directives} -o lib.so {{.o files}} -l:lib2.so
我对C/C++的编译和链接缺乏经验,所以我不确定错误在哪里。C++编译和链接,这意味着将它加载到java中是正确的吗?


更新:我检查了ldd lib.so,发现lib2.so没有链接。

谁使用lib2.so?那么呢?“如果Java虚拟机找不到声明为本机的方法的适当本机语言定义时抛出”您是否从Java执行lib2.so中的任何方法?“lib.so”是带有JNI方法的方法。它在内部使用“lib2.so”中的mysymbol_名称。我猜在这一点上,在创建lib.so时,有些东西没有正确链接。另外,我认为Java没有真正从lib.so调用任何东西,因为它在加载阶段就失败了,并且没有加载回调。我终于把它链接起来了。在link命令的末尾添加了-l2。有点基于这篇文章。是的,那是我的印象。它不是来自JVM,请看这里:-这是您要找的样品。有一个库调用另一个库中的内容。两者都是共享的。确保将lib2.so放在LD_LIBRARY_路径上。请注意,在lib.so中,您不再依赖JVM加载的内容。