2023-01-20 293
我有一个Java程序,该程序正在通过JNI调用C代码,我正在尝试在Linux上运行.外部代码由两个.so文件组成:一个用于JNI绑定(使用SWIG构建),另一个用于实际功能.我在同一目录中有两个库,而ld_library_path则正确设置了. LDD从命令行运行时没有任何问题,但是当我将ld_library_path设置为Eclipse编辑器中的”运行配置”对话框中的相同值并尝试执行程序时,它会收到以下错误:
>
java.lang.unsatisfisfiedlinkerror:[库的路径]/[jni binding库] .so:[实际代码库] .SO:无法打开共享对象文件:否此类文件或目录
>
这使我相信JNI包装库已成功加载,但是当该库试图加载包含实际代码的库时,该库存在失败.有什么方法可以进一步调试?
我将进一步指出,Eclipse编辑器本身正在发生此问题,并且我没有尝试将代码打包到JAR中并在独立的JVM实例中运行.
我认为问题与call to to system.loadlibrary(String)和使用LD_LIBRARY_PATH.使用loadLibrary(” foo”)将在您的java.library.path中查找名为libfoo.so的东西.如果没有找到任何名字的libfoo.
现在,如果您只是设置了ld_library_path,则您想要的本机符号会被链接器自动拾取,因此您无需设置-djava.library.path.
根据我在GDAL项目中的SWIG经验,此错误实际上是无害的,并且由于设置了LD_Library_Path,因此可以正常工作.
我建议使用-djava.library.path和调用loadLibrary fackiit,原因是,如果您决定使用WebStart部署应用程序,您将明确需要致电LoadLibrary才能捡起本机Libs. p>
当我使用Eclipse时,我遵循Daff给出的指令,您在构建路径中的”库”选项卡中的JAR下编辑本机库.再次提到,这只是设置了java.library.path.
可能是您只需要在运行config对话框上找到正确的位置即可放置-djava.library.path = …选项.我认为您想要-D在”参数”选项卡上的” VM参数”中定义,而如果要定义”环境”选项卡上的LD_LIBRARY_PATH. Eclipse会愉快地让您将事物放在他们不会意味着您的意思的地方.无论如何,我以前使用了库,如果有机会,我会查找自己的工作并在此处编辑我的答案.
要尝试的另一件事是使用ld_debug玩.您可以将环境变量ld_debug设置为各种事物(尝试全部),然后Linux加载程序将泄露有关应用程序要加载的所有有用信息.但是就系统而言,当您从eclipse运行应用程序时,您的应用程序只是Eclipse正在做的事情,因此可以以这种方式看到任何库加载行为.
您可以在命令行参数中尝试-Djava.library.path=actual.so?
在Windows上,我在第三方库中遇到了类似的问题,该库将JNI包装器DLL用于其DLL.我的项目在LIB目录中具有DLL,因此我将LIB添加到了路径上(例如PATH=%PATH%;./lib环境变量,一切都开始工作.
以上所述是小编给大家介绍的如何调试linux下的java system.loadlibrary错误?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26008.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态