问题
I am using IntelliJ to run a sample java-jnetpcap application. I have 64 bit JDK in the class path and included the following dependency
<dependency>
<groupId>jnetpcap</groupId>
<artifactId>jnetpcap</artifactId>
<version>1.4.r1425-1f</version>
</dependency>
I am running the below sample.java class
public class PcapReaderDemo
{
private static final String filePath= "/src/main/resources/TAPcapture.pcap";
public static void main(String [] arguments){
final StringBuilder errbuf = new StringBuilder();
Pcap pcap = Pcap.openOffline(filePath,errbuf);
if (pcap == null) {
System.err.printf("Error while opening device for capture: "
+ errbuf.toString());
return;
}
PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
public void nextPacket(PcapPacket packet, String user) {
System.out.printf("Received at %s caplen=%-4d len=%-4d %s\n",
new Date(packet.getCaptureHeader().timestampInMillis()),
packet.getCaptureHeader().caplen(), // Length actually captured
packet.getCaptureHeader().wirelen(), // Original length
user // User supplied object
);
}
};
System.out.println("Cleared");
}
}
It is throwing the below exception:
PcapReaderDemo
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J
at com.slytechs.library.NativeLibrary.dlopen(Native Method)
at com.slytechs.library.NativeLibrary.<init>(Unknown Source)
at com.slytechs.library.JNILibrary.<init>(Unknown Source)
at com.slytechs.library.JNILibrary.loadLibrary(Unknown Source)
at com.slytechs.library.JNILibrary.register(Unknown Source)
at com.slytechs.library.JNILibrary.register(Unknown Source)
at com.slytechs.library.JNILibrary.register(Unknown Source)
at org.jnetpcap.Pcap.<clinit>(Unknown Source)
at com.demo.myapexapp.PcapReaderDemo.main(PcapReaderDemo.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Please suggest your inputs on where it is going wrong.
回答1:
I ran into this exception as well, and discovered that I had forgotten an installation step from RELEASE_NOTES.txt.
The library will fail to find the binaries unless they're placed in an OS default location, or Java is given some way to find them. For me, following the directions made this error go away.
It's hard to summarize it better than the source material, so I'll paste it here directly:
2) Setup native jnetpcap dynamically loadable library. This varies between
operating systems.
* On Win32 systems do only one of the following
- copy the jnetpcap.dll library file, found at root of jnetpcap's
installation directory to one of the window's system folders. This
could be \windows or \windows\system32 directory.
- add the jNetPcap's installation directory to system PATH variable. This
is the same variable used access executables and scripts.
- Tell Java VM at startup exactly where to find jnetpcap.dll by setting
a java system property 'java.library.path' such as:
c:\> java -Djava.library.path=%JNETPCAP_HOME%
- You can change working directory into the root of jnetpcap's
installation directory.
* On unix based systems, use one of the following
- add /usr/lib directory to LD_LIBRARY_PATH variable as java JRE does not
look in this directory by default
- Tell Java VM at startup exactly where to find jnetpcap.dll by setting
a java system property 'java.library.path' such as:
shell > java -Djava.library.path=$JNETPCAP_HOME
- You can change working directory into the root of jnetpcap's
installation directory.
* For further trouble shooting information, please see the following link:
(http://jnetpcap.wiki.sourceforge.net/Troubleshooting+native+library)
回答2:
I solved the same issue this way:
using Ubuntu 16.04
installing jre-1.8.0_181 manually:
- download specific java version (https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html) jre-8u181-linux-x64.tar.gz
- create java directory: mkdir /opt/jre
- extract java: tar -zxf jre-8u181-linux-x64.tar.gz
- Update used java version: update-alternatives --install /usr/bin/java java /opt/jre/jre1.8.0_181/bin/java 100
Download, extract und copy jnetpcap files to lib directory
- wget -O jnetpcap-1.4.r1425 https://downloads.sourceforge.net/project/jnetpcap/jnetpcap/Latest/jnetpcap-1.4.r1425-1.linux64.x86_64.tgz
- tar -xvf jnetpcap-1.4.r1425
- cp jnetpcap-1.4.r1425/libjnetpcap.so /lib/
Run your program
回答3:
1st Place your libjnetpcap.so inside /lib64
2nd Make sure your java version is 1.8.0_181 or below.
回答4:
The solution that works for me was to see what was missing for libjnetpcap with ldd :
$ ldd libjnetpcap.so<br>
linux-vdso.so.1 => (0x00007ffe42706000)<br>
libstdc++.so.6 (0x00007f12ef2ad000)<br>
libpcap.so.0.9.4 => **not found**<br>
libc.so.6 => /lib64/libc.so.6 (0x00007f12eeefe000)<br>
libm.so.6 => /lib64/libm.so.6 (0x00007f12eec7a000)<br>
/lib64/ld-linux-x86-64.so.2 (0x00007f12ef861000)<br>
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f12eea63000)<br>
My version of libjnetpcap.so was searching for a libpcap.so.0.9.4.
So I just made a quick link and check with ldd :
$ ln -s /usr/lib64/libpcap.so /usr/lib64/libpcap.so.0.9.4<br>
$ ldd libjnetpcap.so<br>
linux-vdso.so.1 => (0x00007ffdaadee000)<br>
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007eff8f974000)<br>
libpcap.so.0.9.4 => /usr/lib64/libpcap.so.0.9.4 (0x00007eff8f734000)<br>
libc.so.6 => /lib64/libc.so.6 (0x00007eff8f39f000)<br>
libm.so.6 => /lib64/libm.so.6 (0x00007eff8f11b000)<br>
/lib64/ld-linux-x86-64.so.2 (0x00007eff8ff42000)<br>
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007eff8ef05000)<br>
Then all was good for me.
来源:https://stackoverflow.com/questions/39048964/jnetpcap-java-lang-unsatisfiedlinkerror-com-slytechs-library-nativelibrary-dl