如何使用 JNI/JNA 可以使用的 automake 创建共享库(dylib)?

Posted

技术标签:

【中文标题】如何使用 JNI/JNA 可以使用的 automake 创建共享库(dylib)?【英文标题】:How to created a shared library (dylib) using automake that JNI/JNA can use? 【发布时间】:2013-01-07 20:43:31 【问题描述】:

如何说服 LibTools 生成与 gcc 自动生成的库相同的库?

如果我明确地做事情,这会起作用:

gcc -o libclique.dylib -shared disc.c  phylip.c Slist.c  clique.c
cp libclique.dylib [JavaTestDir]/libclique.dylib

但如果我这样做:

Makefile libclique.la (which is what automake generates)
cp .libs/libclique.1.dylib [JavaTestDir]/libclique.dylib 

Java 找到库但找不到入口点。

我阅读了“如何在 automake 脚本中创建共享库 (.so)?”线程,它有很大帮助。我得到了使用 -shared 标志创建的 dylib(根据生成的 Makefile)。但是当我尝试从 Java Native Access 中使用它时,我得到一个“找不到符号”错误。

查看由 Makefile 生成的 libclique.la,它似乎没有任何关键信息,只是看起来是链接重载和移动内容以方便后续 C/C++ 编译器步骤(我没有),所以我希望libclique.1.dylib 是一个正常运行的动态库。

我猜这是我出错的地方,但是,鉴于 JNA 直接链接到一个 dylib 并且没有用它编译(根据上面引用的讨论中的示例),似乎所有后续编译步骤LibTools 手册中的描述没有实际意义。

注意:我在 Mac 上进行测试,但我还必须在 Windows 和 Linux 机器上执行此操作,这就是我尝试将其放入 Automake 的原因。

注意 2:我使用 Eclipse 进行 Java 开发,是的,我确实导入了 dylib。

谢谢

【问题讨论】:

nm 告诉您关于 .dylib 中的符号的哪些信息?您要查找的符号是否确实在显示的列表中? 很好的问题,然后继续。 LibTools 创建的 dylib 是 dyld_stub_binder,不是真正的 dylib。这令人费解,因为上面提到的文章声称创建了一个功能性的 .so 文件。也许问题是我只需要一个 dylib,我不需要编译可执行文件(实际上我不能,因为 Java 没有被编译,而 JNA 是一个独立的 jar 文件)。所以问题就变成了,如何将 LibTools 输出的内容转换为 gcc 创建的独立 dylib。谷歌没有帮助。 @Oz123 进行了更多测试,修改了库部件中的某些内容并进行了制作。得到以下信息(对不起包装):make all-am gcc -DHAVE_CONFIG_H -I。 -Wall -Wfatal-errors -DNDEBUG -O3 -MT clique.o -MD -MP -MF .deps/clique.Tpo -c -o clique.o clique.c mv -f .deps/clique.Tpo .deps/clique .po /bin/sh ./libtool --tag=CC --mode=link gcc -Wall -Wfatal-errors -DNDEBUG -O3 -o clique phylip.o Slist.o dumptree.o clique.o disc.o -lm libtool:链接:gcc -Wall -Wfatal-errors -DNDEBUG -O3 -o clique phylip.o Slist.o dumptree.o clique.o disc.o -lm 看起来都不错。 @technomage 添加了几个 cmets,但忘记标记给你了。 好吧,我大吃一惊!通过添加 LibTools,我的可执行文件(clique)现在也是一个 dylib,可以由 JNA 直接访问。甚至 LibTool 手册也没有提到这一点。问题以一种非常意想不到的方式解决了。感谢您的帮助。 【参考方案1】:

你应该是building a plugin,尤其是通过

libclique_la_LDFLAGS = -avoid-version -module -shared -export-dynamic

这样你告诉 libtool 你想要一个动态加载的模块而不是一个共享库(对于 ELF 是一样的,但对于 Mach-O 不是。)

【讨论】:

以上是关于如何使用 JNI/JNA 可以使用的 automake 创建共享库(dylib)?的主要内容,如果未能解决你的问题,请参考以下文章

JavaCPP 技术使用经验总结

Java:如何确定文件所在的驱动器类型?

推荐一个 Web 端自动化神器 - Automa

Deep-Trimap-Generation-for-Automatic-Video-Matting-using-GAN

Web 自动化神器,批量下载美图,可直接导入使用

在 java 中转换 MFC 桌面应用程序 GUI