`
zyx_java
  • 浏览: 8330 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

java.lang.unsatisfiedlinkerror Linux系统加载动态链接库失败

阅读更多
刚刚解决个问题,顺便写下来做个记录,也为将来遇到同样问题的人提供个参考。

项目中用到 Jpcap 库,这个库引用到一个 C 的链接库文件

链接库文件放到 /usr/lib 下面

以前在别的Linux系统下都运行的好好的

今天部署到一个 Centos 机器上就报错:java.lang.NoClassDefFoundError: Could not initialize class jpcap.JpcapCaptor 和 java.lang.unsatisfiedlinkerror

看了下 JpcapCaptor 类的源码发现里面有加载动态链接库的代码

肯定就是没找到 动态链接库文件了。

1.重新编译库文件 2.把库文件放到项目根目录,等等几番折腾

最后都要绝望的时候了,突然想起 /etc/ld.so.conf

vi 一看还真没有库目录

加上两行 
/usr/lib
/usr/local/lib

保存   执行 ldconfig命令 生效

问题就这样解决了。

还是有个疑问,难道Centos不会默认去 /usr/lib 下面去查找动态链接库???
0
0
分享到:
评论
3 楼 zyx_java 2012-06-04  
@lixuan74

你的系统是 64 位的吧

如果是64位的系统要修改 Makefile

加上编译参数  -fPIC

找到下面一行(在Makefile文件最下面)

$(CC) $(COMPILE_OPTION) -I$(JNI_INCLUDE) -I$(JNI_INCLUDE2)\
-I$(PCAP_INCLUDE)\

加上参数(也可以直接复制,我的是0.7版本)

$(CC) $(COMPILE_OPTION) -fPIC -I$(JNI_INCLUDE) -I$(JNI_INCLUDE2)\
-I$(PCAP_INCLUDE)\

然后重新编译就好了,会生成一个 libjpcap.so 的文件,复制到 /usr/local/lib,在看看 /etc/ld.so.conf有没有这个路径,没有添加一下,执行 ldconfig,最后在测试。


2 楼 lixuan74 2012-05-28  
我编译jpcap 老是报错,你遇见这样的错误吗?

[root@20120416 c]# make
gcc -shared -L. -I/home/researcher/workdir/soft/jdk/include -I/home/researcher/workdir/soft/jdk/include/linux\
-I/usr/include\
JpcapCaptor.c JpcapSender.c JpcapWriter.c\
          packet_arp.c packet_datalink.c packet_icmp.c packet_ip.c\
          packet_ipv6.c packet_tcp.c packet_udp.c\
-o libjpcap.so -lpcap
JpcapCaptor.c: 在函数‘Java_jpcap_JpcapCaptor_processPacket’中:
JpcapCaptor.c:449:57: 警告:将一个整数转换为大小不同的指针 [-Wint-to-pointer-cast]
JpcapCaptor.c: 在函数‘Java_jpcap_JpcapCaptor_loopPacket’中:
JpcapCaptor.c:468:53: 警告:将一个整数转换为大小不同的指针 [-Wint-to-pointer-cast]
JpcapCaptor.c: 在函数‘dispatcher_handler’中:
JpcapCaptor.c:682:10: 警告:将一个指针转换为大小不同的整数 [-Wpointer-to-int-cast]
JpcapWriter.c: 在函数‘Java_jpcap_JpcapWriter_close’中:
JpcapWriter.c:47:3: 警告:隐式声明与内建函数‘free’不兼容 [默认启用]
packet_icmp.c: 在函数‘analyze_icmp’中:
packet_icmp.c:81:19: 警告:将一个整数转换为大小不同的指针 [-Wint-to-pointer-cast]
packet_icmp.c:83:11: 警告:将一个指针转换为大小不同的整数 [-Wpointer-to-int-cast]
/usr/bin/ld: /tmp/ccAEYIKO.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/ccAEYIKO.o: could not read symbols: Bad value
collect2: ld 返回 1
make: *** [libjpcap.so] 错误 1
[root@20120416 c]#
1 楼 lixuan74 2012-05-28  
hi:我在linux 下,
[root@20120416 researcher]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/lib
/usr/local/lib

jpcap  我是通过源码,以及安装了
在 cd /usr/local/lib 这个目录下也存在这个文件

libpcap.so
也像你那样做了,依然报:
Exception in thread "main" java.lang.UnsatisfiedLinkError: jpcap.JpcapCaptor.getDeviceList()[Ljpcap/NetworkInterface;
at jpcap.JpcapCaptor.getDeviceList(Native Method)
at com.tcp.get.JpcapTip.main(JpcapTip.java:125)

的错误,你有什么好办法吗?

相关推荐

    串口操作组建及示例(串口 java )

    `win32com.dll`是一个Windows平台上的动态链接库,它是Java串口通信在Windows环境下的底层驱动。它实现了Java串口API与操作系统之间的接口,使得Java程序能够调用系统提供的串口服务。在其他操作系统上,可能需要...

    Nocos启动异常.zip

    在Windows系统中,这通常意味着没有将所需的动态链接库放在正确的路径下,或者在系统环境变量`PATH`中未包含这个路径。 2. **版本不匹配**:如果Nacos依赖的RocksDB JNI库与当前系统中的RocksDB版本不兼容,也会...

    libserial_port.so Android串口驱动

    `libserial_port.so`作为一个动态链接库,它的主要任务是封装了对底层串口操作的系统调用,例如`open()`, `read()`, `write()`, `close()`等。这样,开发者无需直接操作设备文件,而是通过调用这个库提供的API,...

    android JNA 依赖jar 包

    - Android系统对动态链接库的加载有特殊要求,需要确保.so文件与设备的架构兼容(armeabi, armeabi-v7a, x86, arm64-v8a等)。 - 将.so文件放置在项目的`jniLibs`目录下,对应于不同架构的子目录中。 - 需要处理...

    java常见异常汇总

    **原因分析**:Windows 和 Linux 下使用的 SWT jar 包版本不一致,导致无法正常加载所需的动态链接库。 **解决方案**:在 Windows 下使用 `swt-3.5M6-win32-win32-x86.jar`,而在 Linux 下则使用 `swt-3.5.1-gtk-...

    如何用Java程序设置系统path环境变量

    // 声明欲加载的动态链接库 } catch (UnsatisfiedLinkError e) { System.err.println("Cannot load library " + e.toString()); } } public native void setEnv(String name, String value, int replace); //...

Global site tag (gtag.js) - Google Analytics