C++ 链接自定义 .so 库,然后使用 JNI

C++ linking custom .so libraries and then with JNI

我在 link 使用 C++ 库时遇到问题,我确实需要一些建议。 我有两个自定义 .so 库,我在我的 cpp 项目中使用它们,然后我使用 JNI linking 到 Java。

在我的 cpp 项目中,我包含了两个库和 JNI 的头文件。然后我正在创建一个目标文件,如下所示:

g++ -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux -std=c++11 -fPIC -c my_file.cpp

这两个includes指定JNI库的路径。我正在使用 cpp11,然后我发现在创建共享库期间可能需要一个开关 -fpic。

接下来我尝试 link 我的目标文件:my_file.o 和两个共享库,如下所示:

g++ -fpic -L/<absolute path>/library1.so -L/<absolute path>/library2.so my_file.o -shared -o my_file.so

我正在构建一个共享库,它将使用 JNI 从 Java 调用。我尝试了组装 linking 参数的几种不同变体,但 none 有效。我进一步在 Java 中调用 System.load() 到 my_file.so 和 library1.so 的绝对路径 目前我收到一个错误:

/usr/lib/jvm/java-7-openjdk-amd64/bin/java: symbol lookup error: /<absoulte path>/my_file.so: undefined symbol: <method from library 1>

我在这里阅读了一些 post 关于 linking 和库的必需参数顺序以确保正确的 linking 并且我已经阅读了很多 g++ 文档,但无论我如何订购它们,无论我使用什么参数,它似乎都不起作用。对于如何 link 这些文件的任何建议,我将不胜感激。

在一些帮助下弄明白了。

首先,对于那些不知道 linux 上的命令 "ldd" 的人,它显示了链接符号(链接库依赖项)。当我看到我的库不在那里时,我试图重新排列链接命令。 我必须将目标文件 my_file.o 放在其他两个库之前。然后我看到 ldd 指出找不到库。我将它们移到系统库中,并使用更多符号链接一切正常。感谢大家的努力