Java JNA代码在OSx中运行良好,但无法在Linux中从C共享对象文件查找函数
我正在使用以下示例: 在mac中,我可以创建.dylib文件,如下所示: gcc-shared-fpic-o librandomjna.o randomjna.c g++-dynamiclib-undefined suppress-flat_名称空间*.o-o librandomjna.dylib mkdir类 javac-d classes-classpath jna-4.4.0.jar JavaNativeAccess.java cd类 导出LD_库_路径= java-classpath jna-4.4.0.jar:。com.enlightedinc.apps.where.utils.JavaNativeAccess 在OSx中,它按预期工作,能够执行C函数列表文件 现在在Linux框中,我创建了.so文件,如下所示 gcc-shared-fpic-o librandomjna.o randomjna.c gcc-共享-o librandomjna.so*.o 同样,在Linux mkdir类中生成新类 javac-d classes-classpath jna-4.4.0.jar JavaNativeAccess.java cd类 导出LD_库_路径= java-classpath jna-4.4.0.jar:。 com.enlightedinc.apps.where.utils.JavaNativeAccess 现在,当我尝试执行这个Ubuntu框中的代码时,我得到以下错误 例外java.lang.UnsatifiedLinkError:查找函数“randomNumber”时出错:/librandomjna.so:未定义符号:randomNumberJava JNA代码在OSx中运行良好,但无法在Linux中从C共享对象文件查找函数,java,c,jna,Java,C,Jna,我正在使用以下示例: 在mac中,我可以创建.dylib文件,如下所示: gcc-shared-fpic-o librandomjna.o randomjna.c g++-dynamiclib-undefined suppress-flat_名称空间*.o-o librandomjna.dylib mkdir类 javac-d classes-classpath jna-4.4.0.jar JavaNativeAccess.java cd类 导出LD_库_路径= java-classpath j
- 有什么可能出错
- .dylib和.so文件之间有什么区别
- 为什么.dylib(mac osx)可以解析所有函数调用,而.so文件(linux)无法查找函数
迦腻色迦首先,尝试以下方法:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.
然后,确保so文件包含您期望的内容
nm librandomjna.so | grep rand
最后,我通过直接从.c文件生成.so文件解决了这个问题 gcc-shared-fpic-o librandomjna.so randomjna.c
现在.so文件包含了所有的符号。如果您还没有决定是使用JNI还是JNA,请看这里以熟悉JNI:BTW-当您克隆repo并运行时会发生什么?它应该是开箱即用的。JNI对我不起作用,因为我在实际项目中没有访问c文件的权限,我只能访问.o/.a/.so文件,所以我尝试了JNA,现在它在生成.so文件后可以正常工作。直接从.c代码我已经设置了>ld_library_路径,是的。so文件缺少符号,因为它是从.o文件生成的。现在我正在生成.so文件,直接从.c文件,正常工作,谢谢。