我是参照http://aswang.iteye.com/blog/1036305 编译出来的。但是我用的libpcap源码是android自带的源码,jnetpcap用的是1.2版本。利用javah时因为要一个一个生成,所以我写了一个比较笨拙的脚本,还好vim比较智能,呵呵,大大减少我写脚本的时间,对于vim还得继续学习。使用下面这个脚本的时候记得把#号去掉。在org一级执行。

#javah path . -jni org.jnetpcap.ByteBufferHandler

#javah path . -jni org.jnetpcap.JBufferHandler

#javah path . -jni org.jnetpcap.JCaptureHeader

#javah path . -jni org.jnetpcap.PcapAddr

#javah path . -jni org.jnetpcap.PcapBpfProgram

#javah path . -jni org.jnetpcap.Pcap

#javah path . -jni org.jnetpcap.PcapClosedException

#javah path . -jni org.jnetpcap.PcapDLT

#javah path . -jni org.jnetpcap.PcapDumper

#javah path . -jni org.jnetpcap.PcapExtensionNotAvailableException

#javah path . -jni org.jnetpcap.PcapHandler

#javah path . -jni org.jnetpcap.PcapHeader

#javah path . -jni org.jnetpcap.PcapIf

#javah path . -jni org.jnetpcap.PcapInteger

#javah path . -jni org.jnetpcap.PcapPktBuffer

#javah path . -jni org.jnetpcap.PcapPktHdr

#javah path . -jni org.jnetpcap.PcapSockAddr

#javah path . -jni org.jnetpcap.PcapStat

##javah path . -jni org.jnetpcap.PcapTasK

#javah path . -jni org.jnetpcap.PcapUtils$1

#javah path . -jni org.jnetpcap.PcapUtils$2

#javah path . -jni org.jnetpcap.PcapUtils$3

#javah path . -jni org.jnetpcap.PcapUtils$4

#javah path . -jni org.jnetpcap.PcapUtils

#javah -classpath . -jni org.jnetpcap.packet.JBinding

#javah -classpath . -jni org.jnetpcap.packet.JBinding$DefaultJBinding

#javah -classpath . -jni org.jnetpcap.packet.JDependency

#javah -classpath . -jni org.jnetpcap.packet.JHeader$1

#javah -classpath . -jni org.jnetpcap.packet.JHeader

#javah -classpath . -jni org.jnetpcap.packet.JHeaderPool$1

#javah -classpath . -jni org.jnetpcap.packet.JHeaderPool

#javah -classpath . -jni org.jnetpcap.packet.JHeaderScanner

#javah -classpath . -jni org.jnetpcap.packet.JHeader$State#javah -classpath . -jni org.jnetpcap.packet.JProtocol

#javah -classpath . -jni org.jnetpcap.packet.JRegistry

#javah -classpath . -jni org.jnetpcap.packet.JRegistry$Entry

#javah -classpath . -jni org.jnetpcap.packet.JScan

#javah -classpath . -jni org.jnetpcap.packet.JScanner$1

#javah -classpath . -jni org.jnetpcap.packet.JScanner

#javah -classpath . -jni org.jnetpcap.packet.PcapPacket

#javah -classpath . -jni org.jnetpcap.packet.UnregisteredHeaderException

#javah -classpath . -jni org.jnetpcap.packet.UnregisteredScannerException

#javah -classpath . -jni org.jnetpcap.nio.JBuffer

#javah -classpath . -jni org.jnetpcap.nio.JFunction

#javah -classpath . -jni org.jnetpcap.nio.JMemory

#javah -classpath . -jni org.jnetpcap.nio.JMemoryPool$Block

#javah -classpath . -jni org.jnetpcap.nio.JMemoryPool

#javah -classpath . -jni org.jnetpcap.nio.JMemory$Type

#javah -classpath . -jni org.jnetpcap.nio.JNumber

#javah -classpath . -jni org.jnetpcap.nio.JNumber$Type

#javah -classpath . -jni org.jnetpcap.nio.JStruct

javah -classpath . -jni org.jnetpcap.winpcap.WinPcap$1

javah -classpath . -jni org.jnetpcap.winpcap.WinPcap

javah -classpath . -jni org.jnetpcap.winpcap.WinPcapRmtAuth

javah -classpath . -jni org.jnetpcap.winpcap.WinPcapSamp

javah -classpath . -jni org.jnetpcap.winpcap.WinPcapSendQueue

javah -classpath . -jni org.jnetpcap.winpcap.WinPcapStat

#javah -classpath . -jni org.jnetpcap.packet.JPacket

#javah -classpath . -jni org.jnetpcap.packet.JPacketHandler

#javah -classpath . -jni org.jnetpcap.packet.JPacket$State

1、下载源代码

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

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

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

$wget http://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 . -jni org.jnetpcap.Pcap命令 来为class生成对应的.h头文件

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

但是结果还是报错了:

在 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代码中就可以如下来加载这个共享库:

Java代码  

System.loadLibrary("jnetpcap");

至此,编译工作已完成。

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

android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)

LOCAL_MODULE    := **

LOCAL_SRC_FILES := **.c

LOCAL_LDLIBS :=$(LOCAL_PATH)/**.a

include $(BUILD_EXECUTABLE)

winpcap java封装_利 用jnetpcap 封装libpcap相关推荐

  1. java mvc数据库 封装_关于SpringMvc参数封装_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...

    SpringMVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring MVC 分离了控制器.模型对象.分派器以及处理程序对象 ...

  2. 如何根据原理图画封装_如何根据业务封装自己的功能组件

    查询回显input的封装 最近有幸在做一个管理系统采用的是vue+element-ui, 表单页面非常多, 而且都出奇的大,在多页面开发的时候做大表单的优缺点我大概先说一下, 我们的任务是, 基于现在 ...

  3. python异常类封装_在Python中封装异常

    如何使应用程序与使用过的库依赖关系所引发的异常脱钩? [app] --uses--> [lib] --dependson--> [dependency] / / x- \ / `----- ...

  4. java 代码封装_封装 java代码

    Java工程师必知词汇:封装 |名词定义| 封装(Encapsulation)是将数据和处理数据的程序组合起来,仅对外公开接口,达到信息隐藏的功能.封装的优点是能减少耦合.Java定义对象都是在语法中 ...

  5. Java讲课笔记10:类的封装

    文章目录 零.本讲学习目标 1.掌握类的封装 2.学会使用方法的重载 3.学会方法的递归 一.类的封装 1.为什么需要封装 (1)案例演示 (2)案例分析 (3)解决方案 2.如何实现封装 (1)封装 ...

  6. android loading封装_我们经常用的Loading动画居然还有这种姿势

    背景 Loading动画几乎每个Android App中都有. 一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验. 同样的 ...

  7. 多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态

    @Python大星 一.Python 类的封装.继承和多态 封装 继承 Python 支持多父类的继承机制,所以需要注意圆括号中基类的顺序,若是基类中有相同的方法名,并且在子类使用时未指定,Pytho ...

  8. java 指代对象_06JAVA面向对象之封装

    一.面向对象 1.面向过程和面向对象 面向过程 分析问题的步骤,然后逐步实现. 面向对象 (1)面向对象基于面向过程 (2)面向对象是找出解决问题的人,然后分配职责. (3)对象中包含解决问题的步骤 ...

  9. Java 面向对象编程的三大特性——封装、继承、多态

    一.类和对象 1. 首先,什么是对象呢? 对象简单的来说就是一个实物,比如一部 iPhone X 手机,它就是对象.它的屏幕.内存等就是它的属性. 手机能够打电话,发短信,这个功能就是它的方法. 2. ...

  10. Java基础篇——三大特性(封装)

    Java三大特性我会用自己理解给大家一一介绍,有兴趣的可以关注一下,可以让你学到一些基础但是又非常实用的东西,基本上都是自己的一些理解和实践结果,对于新手来说可以避免走弯路(后期会出Java的其他重要 ...

最新文章

  1. IT人的自我导向型学习:开篇杂谈
  2. crontab执行不了php的解决方法
  3. 求二叉树指定结点到根的路径c语言,二叉树根节点到叶子结点和为指定值的路径...
  4. 深入理解HTML表格
  5. android做一个坦克大战小游戏_一个 ECharts 做的猜数小游戏
  6. python pp模块_python常用模块
  7. 二分法查找(Java)
  8. runloop的mode作用是什么?
  9. 【图像边缘检测】基于matlab最小二乘法椭圆边缘检测【含Matlab源码146期】
  10. 分子动力学模拟软件VMD的安装与使用
  11. BPSK调制与解调-MATLAB基带仿真
  12. unreal-教程-第十八章:UI跟随的基本原理(c++)
  13. 小重山 【南宋】 岳飞
  14. 全面解读Moby和LinuxKit,Docker称沟通不善招致误解
  15. 软件测试人员面试技巧总结
  16. 分销的概念、本质、模式
  17. python用渐变色画圆_画圆圈和设置渐变色
  18. UVa 11549 Calculator Conundrum (训练指南,Floyd 判圈算法)
  19. 【Java练习题】Java 程序的输出 | 第十三套(集合)
  20. AMH面板 or 宝塔面板DnsPod动态解析IPv6(Python)

热门文章

  1. Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计...
  2. plusgantt的项目管理系统实战开发最全课程
  3. Oracle EBS-SQL (OM-2):检查OM常用表
  4. 【sed 工具的使用】
  5. 函数式编程能否支持更高效的区块链基础设施?
  6. 谈谈如何用eoLinker管理各类API接口
  7. 《Effective Ruby:改善Ruby程序的48条建议》一第6条:了解Ruby如何构建继承体系
  8. 第二百一十六节,jQuery EasyUI,Spinner(微调)组件
  9. 解决:PHP Deprecated: Comments starting with '#' are deprecated in ……
  10. 基于原生javascript的淡入淡出函数封装(兼容IE)