当前位置: 代码迷 >> Android >> 在android平台下编译libpcap-0.9.8 和 jnetpcap-1.3.0-1
  详细解决方案

在android平台下编译libpcap-0.9.8 和 jnetpcap-1.3.0-1

热度:81   发布时间:2016-05-01 16:58:44.0
在android平台上编译libpcap-0.9.8 和 jnetpcap-1.3.0-1

昨天尝试编译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工作的蛮好的,那就继续使用吧。这从编译权当做练习了!

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

1 楼 gezexu 2011-08-29  
楼主你好,我也成功编译了libpcap0.9.8和jnetpcap1.2,当时当我当我在模拟器中调用的时候总是找不到网卡列表,Pcap.findAllDevs(alldevs, errbuf);执行这个方法,可以成功,但是集合alldevs为空,怀疑是模拟器的原因,后来把程序部署到真机上跑.问题依旧,请问你编译的so能够正确获取网卡列表吗?如果可以的话,麻烦给我发一份([email protected]),谢谢了,我的qq:304075296加我交流一下
  相关解决方案