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 共享对象文件中查找函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OSX 中使用 Dropbox 目录作为虚拟主机 Document Root?