开发者社区> 问答> 正文

windows平台开发,在eclipse中使用java如何调用.so文件,试了半天还是不行:?报错

windows平台开发,在eclipse中使用java如何调用.so文件,试了半天还是不行:
1、java工程项目不是安卓项目,是web项目,
2、.so是linux下生成的动态库,.dll是windows下生成的动态库,网上几乎全部是linux下调用.so动态库,windows下调用.dll动态库
3、安卓工程是使用jni调用.so动态库,在web项目中个人使用了jna去调用.so动态库,错误就在期待下发送了,
     报错:java.lang.UnsatisfiedLinkError: Unable to load library 'EcgAnalysis':
     但是如果把.so文件换成.dll文件是可以得到这个object的。
特别声明:.so文件只是一些算法,没有linux系统底层的调用
所以:是否能够得出结论,windows下java开发只能调用.dll动态库,linux下java开发只能调用.so动态库,
如果不是,怎么能够在windows下java web项目开发调用.so文件,求各路神仙解惑

展开
收起
爱吃鱼的程序员 2020-06-07 22:34:51 1893 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    好像win下只能调用dll,既然你是用c/c++开发的库,那就应该尽可能的使用跨平台的api,win下发布为dll,linux下发布为so。就像汽车靠轮子走,轮船靠螺旋桨走是一个道理,虽然都是发动机带动。so是linux下编译的库文件而dll是win平台的

    是不是win上面安装了EcgAnalysis,linux上面没有安装EcgAnalysis类?

     

    你可以去看一些跨平台的解决方案,例如Eclipse中的插件,需要调用dll/so,它会同时内置两种文件dll/so,然后程序运行的时候,通过获取os.name去判断是windows还是linux,然后通过System.loadLibrary方法去加载对应的版本。

    不是说so中没有调用linux的平台windows下就可以调用。dll和so分别是windows和linux下定义的代码库的标准,文件的格式是windows和linux自己定义的,肯定是不兼容的,因此无法实现一个版本多个平台通吃的。

    所以,还是按照检测系统、加载不通的库的方式来吧

    回复<aclass="referer"target="_blank">@hhl3136:请把第一个参数改为so文件的绝对路径试试回复<aclass="referer"target="_blank">@依然菜刀:Clibraryinstance=(Clibrary)Native.loadLibrary("EcgAnalysis",Clibrary.class);回复<aclass="referer"target="_blank">@hhl3136:把加载so部分的代码贴出来!要崩溃了,菜鸟请教大神,我现在只有一个so文件,在linux中把so文件copy到/usr/lib中,但是使用jna还是不能调用,报错:connotopensharedobjectfile,nosuchfileordirectoryso是linux下动态库,Windows下如果做android开发可以写代码调so

    根据你的表述,应该是环境变量的问题,可能你的linux没有将/usr/lib加入到环境变量中,因此请不要使用System.loadLibrary+库名称的方式加载,考虑改为System.load(文件绝对路径)的方式加载!

    回复<aclass="referer"target="_blank">@依然菜刀:老哥,看下我用几种平台下的so文件,使用绝对路径调用报的错回复<aclass="referer"target="_blank">@hhl3136:看我的多条回复,说的已经很清楚了回复<aclass="referer"target="_blank">@依然菜刀:原谅我的无知,so文件不都是在linux上生成的吗?安卓可以直接调用这个so吗?回复<aclass="referer"target="_blank">@hhl3136:Linux的so库一般要在X86平台下编译,Android手机都采用ARM平台,两个平台的指令集都不一样回复<aclass="referer"target="_blank">@hhl3136:原来在Android上的需要拿源代码到Linux环境下重新编译才能使用

    X86=======Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:/usr/lib/libEcgAnalysis.so:wrongELFclass:ELFCLASS32(Possiblecause:architecturewordwidthmismatch)
    x86_64
    Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:liblog.so:cannotopensharedobjectfile:Nosuchfileordirectory
    arm64
    Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:/usr/lib/libEcgAnalysis.so:cannotopensharedobjectfile:Nosuchfileordirectory(Possiblecause:can'tloadthis.so(machinecode=0xb7)onaAMD64-bitplatform)
    mips64
    Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:/usr/lib/libEcgAnalysis.so:cannotopensharedobjectfile:Nosuchfileordirectory(Possiblecause:can'tloadMIPS-bit.soonaAMD64-bitplatform)
    mips
    Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:/usr/lib/libEcgAnalysis.so:wrongELFclass:ELFCLASS32(Possiblecause:architecturewordwidthmismatch)

    armeabi-v7a
    Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:/usr/lib/libEcgAnalysis.so:wrongELFclass:ELFCLASS32(Possiblecause:architecturewordwidthmismatch)
    arneabi
    Exceptioninthread"main"java.lang.UnsatisfiedLinkError:/usr/lib/libEcgAnalysis.so:/usr/lib/libEcgAnalysis.so:wrongELFclass:ELFCLASS32(Possiblecause:architecturewordwidthmismatch)

    回复<aclass="referer"target="_blank">@依然菜刀:好的,非常感谢!!别想了,C++是不能夸平台的,一定要对应平台的才行,想办法拿源码,重新编译吧,当然,你也可以用虚拟机技术

    2020-06-07 22:35:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载

相关镜像