昨天尝试编译libpcap0.9.8和jnetpcap1.2成功了,今天想着能不能编译libpcap0.9.8和jnetpcap-1.3.0-1。
因为jnetpcap-1.3.0-1也支持libpcap的0.9.8版本。
?
libpcap0.9.8的源码下载参见前一篇文章:
http://aswang.iteye.com/blog/1036305
?
jnetpcap-1.3.0-1的下载地址:
http://jnetpcap.com/download
?
源码下载完毕之后,还是新建一个目录,把libpcap0.9.8 和jnetpcap-1.3.0-1的c源码放在一起,然后在该目录中新建Android.mk文件,内容如下:(当然javah命令还是需要执行,以便生成对应的头文件)
?
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
?
LOCAL_SRC_FILES:=\
bpf_dump.c\
bpf/net/bpf_filter.c\
bpf_image.c\
etherent.c\
fad-gifc.c\
gencode.c\
grammar.c\
inet.c\
nametoaddr.c\
optimize.c\
pcap.c\
pcap-linux.c\
savefile.c\
scanner.c\
version.c
?
LOCAL_CFLAGS:=-O2 -g
LOCAL_CFLAGS+=-DHAVE_CONFIG_H -D_U_="__attribute__((unused))" -Dlinux -D__GLIBC__ -D_GNU_SOURCE
?
LOCAL_MODULE:= libpcap
include $(BUILD_STATIC_LIBRARY)
?
#LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
?
LOCAL_SRC_FILES:=\
jnetpcap.cpp\
jnetpcap_beta.cpp\
jnetpcap_bpf.cpp\
jnetpcap_dumper.cpp\
jnetpcap_ids.cpp\
jnetpcap_pcap_header.cpp\
jnetpcap_utils.cpp\
nio_jbuffer.cpp\
nio_jmemory.cpp\
nio_jnumber.cpp\
packet_flow.cpp\
packet_jheader.cpp\
packet_jheader_scanner.cpp\
packet_jpacket.cpp\
packet_jscan.cpp\
packet_jsmall_scanner.cpp\
packet_protocol.cpp\
util_checksum.cpp\
util_debug.cpp\
util_in_cksum.cpp\
winpcap_ext.cpp\
winpcap_ids.cpp\
winpcap_send_queue.cpp\
winpcap_stat_ex.cpp
?
LOCAL_MODULE:= libjnetpcap
LOCAL_STATIC_LIBRARIES := libpcap
include $(BUILD_SHARED_LIBRARY)
?
然后进行ndk-build编译,编译报错:
说未定义的引用:crc16_ccitt_seed 等
?
结果找到对应的头文件了:
util_crc16.h 、util_crc32.h
但是没有发现对应的.c文件,于是上网搜索,看看这两个头文件是不是已经在某个库里面实现了,结果没发现有哪个c函数库包含这两个文件,为这个问题纠结了很长时间,最后想是不是下载的包里面没有包含这两个头文件的c源文件,于是想着从svn库里面checkout出来看看,于是到jnetpcap官网上去看文档了,结果还让我找到了svn的地址:
svn co https://jnetpcap.svn.sourceforge.net/svnroot/jnetpcap/jnetpcap/trunk jnetpcap
(网址:http://jnetpcap.com/node/329),索性就把源码全部下载了,结果还真找到了util_crc32.c和util_crc16.c文件。
?
文件找到了,问题怎么解决?直接修改Android.mk文件,在jnetpcap模块的LOCAL_SRC_FILES:=\下面加上这两个c文件:
?
LOCAL_SRC_FILES:=\
util_crc16.c\
util_crc32.c\
jnetpcap.cpp\
......
?
然后,继续编译,成功!
?
虽然成功了,但是后来在android上测试的时候,发现没法使用,因为jnetpcap里面使用了在android里面不支持的java.awt.Image类,虽然找到一些解决办法(例如使用兼容性的java.awt.Image库),但是想想也没必要使用最新版本的,之前的jnetpcap1.2工作的蛮好的,那就继续使用吧。这从编译权当做练习了!
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?