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

hhl3136 发布于 2017/11/21 19:31
阅读 2K+
收藏 0

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文件,求各路神仙解惑

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

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

 

0
依然菜刀
依然菜刀

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

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

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

依然菜刀
依然菜刀
回复 @hhl3136 : 请把第一个参数改为so文件的绝对路径试试
hhl3136
hhl3136
回复 @依然菜刀 : Clibrary instance = (Clibrary)Native.loadLibrary("EcgAnalysis",Clibrary.class);
依然菜刀
依然菜刀
回复 @hhl3136 : 把加载so部分的代码贴出来!
hhl3136
hhl3136
要崩溃了,菜鸟请教大神,我现在只有一个so文件,在linux中把so文件copy到/usr/lib中,但是使用jna还是不能调用,报错:connot open shared object file, no such file or directory
0
无锡首席大都督程序员
so是linux下动态库,Windows 下如果做android开发可以写代码调so
0
依然菜刀
依然菜刀

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

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

X86 =======Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: /usr/lib/libEcgAnalysis.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
x86_64
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: liblog.so: cannot open shared object file: No such file or directory
arm64
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: /usr/lib/libEcgAnalysis.so: cannot open shared object file: No such file or directory (Possible cause: can't load this .so (machine code=0xb7) on a AMD 64-bit platform)
mips64
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: /usr/lib/libEcgAnalysis.so: cannot open shared object file: No such file or directory (Possible cause: can't load MIPS-bit .so on a AMD 64-bit platform)
mips
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: /usr/lib/libEcgAnalysis.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)

armeabi-v7a
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: /usr/lib/libEcgAnalysis.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
arneabi
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libEcgAnalysis.so: /usr/lib/libEcgAnalysis.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)

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