1、下载源代码

$git clonegit://android.git.kernel.org/platform/external/libpcap.git

(从android官方源码站点下载libpcap代码,版本为0.9.8)

之前在网上查到jnetpcap1.2版本支持libpcap-0.9.8,所以下载jnetpcap-1.2.rc1.zip

http://sourceforge.net/projects/jnetpcap/files/jnetpcap/1.2/stable/

$wgethttp://ncu.dl.sourceforge.net/project/jnetpcap/jnetpcap/1.2/stable/jnetpcap-1.2.rc1.zip

2、在android的ndk目录下,新建一个目录jnetpcap1.2,其中包括子目录jni

将libpcap的源文件和jnetpcap-1.2.rc1.zip里面的c源文件拷贝到jni目录(即将所有源文件放在同一个目录下)。

3、打开jni目录下的Android.mk文件(这个文件是libpcap源码里面带的),将其修改为如下内容:

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_jheader.cpp\

packet_jheader_scanner.cpp\

packet_jpacket.cpp\

packet_jscan.cpp\

packet_jsmall_scanner.cpp\

packet_protocol.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)

4、切换到jni目录下,执行如下命令:

$ndk-build V=1 -B NDK_LOG=1

(后面加参数是为里输出日志信息,便于挑错,-B是重新编译)

编译报错:



意思是找不到对应的头文件。

因为jnetpcap 是通过jni对libpcap的封装,所以我们需要为jnetpcap里面的native方法生成头文件。

接下来,首先编译jnetpcap1.2源码中的java源码,得到对应的class文件;

然后,在class目录下,通过javah -classpath . -jniorg.jnetpcap.Pcap命令 来为class生成对应的.h头文件

最后,将生成的.h文件全部拷贝到jni目录下,重新编译。编译过程中会出现很多警告,影响不大。

但是结果还是报错了:



上面这个问题,最后是google 解决的,在此谢过:http://comments.gmane.org/gmane.comp.handhelds.android.ndk/4066

grammar.y 和 grammar.c文件中,注释掉以下内容:

//#ifndef YYBISON
int yyparse(void);

int
pcap_parse()
{
return (yyparse());
}
//#endif

同时在scanner.c和scanner.l中注释掉以下内容:

//#define yylval pcap_lval

然后重新运行,$NDK/ndk-build V=1 -B NDK_LOG=1

如果能够看到如下输出信息,则说明编译成功。


编译成功后,会在jnetpcap1.2目录下自动创建一个libs目录,在该目录下包含一个子目录armeabi,在这个目录下包含编译生成的共享库:libjnetpcap.so

在java代码中就可以如下来加载这个共享库:

System.loadLibrary("jnetpcap");

至此,编译工作已完成。

使用类似的方法,可以编译成功jnetpcap1.2.r5,但是在编译jnetpcap1.3.0-1会出问题,后面会将编译jnetpcap1.3.0-1的过程写下来。

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 在android平台上编译libpcap-0.9.8 和 jnetpcap-1.2.rc1
  4. Android(安卓)Manifest文件中meta-data的配置读取
  5. [转]Android文件管理器介绍
  6. 使用Android(安卓)Instrument 自动测试 WIFI_SERVICE
  7. Android(安卓)模板编写
  8. Android(安卓)控件之Gallery图片集
  9. android使用pull解析器来解析和生成xml文件

随机推荐

  1. [转]自己整理的android入门QA表,希望能帮
  2. Android系统的架构
  3. Android样式和主题
  4. Looper
  5. Android绘图机制与处理技巧——Android图
  6. Android之自制的分页表格控件
  7. Android最新源码4.3下载-教程 2013-11
  8. Android应用程序与SurfaceFlinger服务的
  9. Unity 与Android的交互(Android(安卓)stu
  10. Android小項目之---ListView实现论坛管理