转载自 https://www.codeleading.com/article/96645490172/
使用环境 java 通过 jni 方式调用 jpcap
因为这玩意10年未更新,编译好的 so 只能在 x86 环境使用,对于arm平台无法直接使用
下载源码 https://github.com/ioleary/jpcap-0.7
编译目录 jpcap-0.7-master/src/c
依赖 libpcap-devel java-1.8.0-openjdk java-1.8.0-openjdk-devel
依赖包直接通过软件源下载 yum install libpcap-devel java-1.8.0-openjdk java-1.8.0-openjdk-devel
debian 或 ubuntu 环境使用 apt-get install libpcap-devel java-1.8.0-openjdk java-1.8.0-openjdk-devel
编译依赖,需要复制的文件 jni.h 等
安装好openjdk之后访问目录 /usr/lib/jvm/java-1.8.0/include/ ,复制 jni.h 到 /usr/include/ 目录下
另外还需要复制 /usr/lib/jvm/java-1.8.0/include/linux/jni_md.h 到 /usr/include/ 目录下,另外一个 jawt_md.h 可以不用复制
然后修改文件 jpcap-0.7-master/src/c/Makefile 增加 -fPIC 参数
all: libjpcap.so
libjpcap.so: 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
$(CC) $(COMPILE_OPTION) -fPIC -I$(JNI_INCLUDE) -I$(JNI_INCLUDE2)
-I$(PCAP_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$(SUFFIX) -lpcap
clean:
-rm libjpcap$(SUFFIX)
这里修改完成后就可以执行命令:make
然后一堆 warning 提示,可以不管,当前目录下就可以看到 libjpcap.so 文件了
验证:readelf -h libjpcap.so (没有这个命令就自己yum安装)
[root@localhost c]# readelf -h libjpcap.so
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: AArch64
Version: 0x1
Entry point address: 0x3270
Start of program headers: 64 (bytes into file)
Start of section headers: 76264 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 7
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 28
上面命令执行后就可以看到我们要的 ELF64,机器是 AArch64 (我的设备是 arm cpu)
然后就是 运行你的 java 代码测试 jpcap 功能了
命令参数 参考文章:https://blog.csdn.net/wsmnbzbraw333/article/details/83972612