`
zyx_java
  • 浏览: 8300 次
  • 性别: 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)

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

相关推荐

Global site tag (gtag.js) - Google Analytics