JNA 代码在 OSx 中运行良好,但无法在 Linux 中从 C 共享对象文件中查找函数

Posted

技术标签:

【中文标题】JNA 代码在 OSx 中运行良好,但无法在 Linux 中从 C 共享对象文件中查找函数【英文标题】:JNA code working fine in OSx , but unable to lookup function in Linux from C shared object file 【发布时间】:2017-07-28 06:13:59 【问题描述】:

我正在使用以下示例:https://github.com/caplin/jnijnaexamples/tree/master/jna

在 mac 中,我可以按如下方式创建 .dylib 文件:

gcc -shared -fpic -o librandomjna.o randomjna.c

g++ -dynamiclib -undefined suppress -flat_namespace *.o -o librandomjna.dylib

mkdir 类

javac -d classes -classpath jna-4.4.0.jar JavaNativeAccess.java

cd 类

导出 LD_LIBRARY_PATH=。

java -classpath jna-4.4.0.jar:. com.enlightedinc.apps.where.utils.JavaNativeAccess

在 OSx 中,它按预期工作并且能够执行 C 函数 list_files

现在在 Linux Box 中,我创建了 .so 文件,如下所示

gcc -shared -fpic -o librandomjna.o randomjna.c

gcc -shared -o librandomjna.so *.o

同理,Linux mkdir classes 中生成新的类

javac -d classes -classpath jna-4.4.0.jar JavaNativeAccess.java

cd 类

导出 LD_LIBRARY_PATH=。

java -classpath jna-4.4.0.jar:. com.enlightedinc.apps.where.utils.JavaNativeAccess

现在当我尝试在这个 Ubuntu 框中执行代码时,出现以下错误 异常java.lang.UnsatisfiedLinkError:查找函数'randomNumber'时出错:./librandomjna.so:未定义符号:randomNumber

可能出了什么问题? .dylib 和 .so 文件有什么区别? 为什么 .dylib (mac osx) 可以解析所有函数调用,而 .so 文件 (linux) 无法查找函数?

我们将不胜感激。

谢谢 卡尼斯卡

【问题讨论】:

如果您还没有决定是使用 JNI 还是 JNA,请看这里以熟悉 JNI:jnicookbook.owsiak.org 顺便说一句 - 当您克隆 repo 并执行 make run 时会发生什么?它应该开箱即用。 JNI 对我不起作用,因为我无法访问实际项目中的 c 文件,我只能访问 .o / .a / .so 文件 所以我试过 JNA,现在它在直接从 .c 代码生成 .so 文件后工作正常 【参考方案1】:

首先,尝试以下操作:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

然后,确保您的 so 文件包含您期望的内容

nm librandomjna.so | grep rand

【讨论】:

我已经设置了 > ld_library_path 并且是的 .so 文件缺少从 .o 文件生成的符号 现在我直接从 .c 文件生成 .so 文件,它工作正常,谢谢。【参考方案2】:

最后,我通过直接从.c文件生成.so文件解决了这个问题

gcc -shared -fpic -o librandomjna.so randomjna.c

现在 .so 文件包含所有符号。

【讨论】:

以上是关于JNA 代码在 OSx 中运行良好,但无法在 Linux 中从 C 共享对象文件中查找函数的主要内容,如果未能解决你的问题,请参考以下文章

我的 mac osx 启动的 plist 无法运行

如何在 OSX 中使用 Dropbox 目录作为虚拟主机 Document Root?

代码块无法在 mac OSX 上编译

PyCharm 无法解析 PyGObject 3.0,但代码运行良好

使用jna和CreateProcessW时如何获取进程输出

Loadbitmap 在 x86 上编译和运行良好,但在编译为 x64 时无法正常工作