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
http://sourceforge.net/projects/jnetpcap/files/jnetpcap/1.2/stable/
$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目录下,重新编译。编译过程中会出现很多警告,影响不大。
但是结果还是报错了:
上面这个问题,最后是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的过程写下来。
?
?
?
?
?
?
?
结果只生成了一个H文件 请问这是什么问题 结果无法生成so文件
希望大哥看到留言后 能给个回复 再次感谢
结果只生成了一个H文件 请问这是什么问题 结果无法生成so文件
希望大哥看到留言后 能给个回复 再次感谢
编译class之后,通过javah命令只会生成对应的头文件,而不会生成其它文件。
然后,你根据头文件去编写相应的C或者C++实现,最后通过ndk将其编译为.so库文件,再导入到android项目使用。
我是参照jnetpcap.cpp 找到里面的Java_org_jnetpcap_Pcap_libVersion这个函数做测试.代码如下 private native String libVersion();
但是执行libVersion时程序报错,现在不知道问题出在哪,麻烦您指教下.这个问题困扰我3天了,谢谢了.
我是参照jnetpcap.cpp 找到里面的Java_org_jnetpcap_Pcap_libVersion这个函数做测试.代码如下 private native String libVersion();
但是执行libVersion时程序报错,现在不知道问题出在哪,麻烦您指教下.这个问题困扰我3天了,谢谢了.
你得确保你的 库 成功被加载。
可以看看logcat的日志信息,里面包含有加载.so库的信息
你得确保你的 库 成功被加载。
可以看看logcat的日志信息,里面包含有加载.so库的信息
07-04 08:56:34.082: D/dalvikvm(337): No JNI_OnLoad found in /data/data/org.jnetpcap.Pcap/lib/libjnetpcap.so 0x40514e88, skipping init
还真是,没加载成功,郁闷了,第一次搞NDK,新手。。。。。
能否发我一份你编译好的.so文件到我邮箱,我的邮箱 [email protected]
我的qq 21953354
[email protected]
这是怎么回事?
能否发我一份你编译好的.so文件到我邮箱,我的邮箱 [email protected]