我必须为我的学士论文写一个Android的Wifi嗅探器。嗅探器本身是用C ++编写的,使用libtins,"一个高级的,多平台的C ++网络数据包嗅探和制作库。"它工作正常,没有问题。现在我需要在我的Android应用程序中使用该代码。因此,我试图交叉编译libtins以便在Android上使用我的代码。
为了编译它,我使用以下命令从Android NDK设置了一个独立的工具链:
make-standalone-toolchain.sh --platform=android-19 --install-dir=/home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain --toolchain=arm-linux-androideabi-4.8 --stl=libc++
libtins在其构建系统中使用cmake。我按照libtins主页上的交叉编译教程。因为我也在我的主机系统上使用-std = c ++ 11标志编译它(debian 7 btw)我也尝试使用带有NDK的C ++ 11。 但运行以下命令
cmake ../ -DLIBTINS_ENABLE_WPA2=0
-DLIBTINS_ENABLE_CXX11=1
-DLIBTINS_BUILD_SHARED=0
-DCMAKE_FIND_ROOT_PATH=/home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY
-DCMAKE_CXX_COMPILER=/home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/bin/arm-linux-androideabi-gcc-4.8
-DCMAKE_C_COMPILER=/home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/bin/arm-linux-androideabi-gcc-4.8
给了我这个错误:
-- The CXX compiler identification is GNU 4.8.0
-- Check for working C compiler: /home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/bin/arm-linux-androideabi-gcc-4.8
-- Check for working C compiler: /home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/bin/arm-linux-androideabi-gcc-4.8 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/bin/arm-linux-androideabi-gcc-4.8
-- Check for working CXX compiler: /home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/bin/arm-linux-androideabi-gcc-4.8 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Setting build type to 'RelWithDebInfo' as none was specified.
-- Build will generate a static library.
-- Found PCAP: /home/henrik/Bachelorarbeit/Sources/lib/Android-19_Toolchain/lib/libpcap.a
[shortened]
CMake Error at CMakeLists.txt:60 (MESSAGE):
C++11 features requested but the compiler does not support them.
-- Configuring incomplete, errors occurred!
这使我感到困惑,因为根据NDK文档支持C ++ 11。关闭C ++ 11对libtins的支持使得cmake可以运行。 但是,由于找不到ifaddrs.h,编译会出错。我找到了this git repository,它提供了一个ifaddrs.h文件,我可以使用相同的独立工具链交叉编译,创建一个静态库。将此lib及其头文件添加到libtins目录可以解决 ifaddrs.h:没有这样的文件或directoy 问题但会导致另一个问题:
...libtins-master/src/network_interface.cpp: In member function 'bool InterfaceInfoCollector::operator()(const ifaddrs*)':
.../libtins-master/src/network_interface.cpp:96:85: error: 'const struct ifaddrs' has no member named 'ifa_ifu'
info->bcast_addr=IPv4Address(((struct sockaddr_in*)addr->ifa_ifu.ifu_broadaddr)->sin_addr.s_addr);
似乎ifaddrs.h我使用的不像linux提供的那样正常。
有谁知道如何解决这个问题?我担心我写的C ++代码包含一些C ++ 11特定的方法(这里不确定,它只适用于我的主机系统)因此我不想错过这个功能(除此之外,libtins用C ++ 11)运行得更快。 有什么方法可以让这个工作或者我必须使用libpcap在C中重写那个嗅探器,这需要花费很多时间,因为它至少对我而言似乎比我迄今为止使用libtins更复杂
提前致谢=)
修改
尝试在启用C ++ 11支持的情况下运行cmake后,cmakeerror.log包含以下行:CheckFunctionExists.c:function main: error: undefined reference to pcap_get_pfring_id
我为android编译的libpcap并没有包含它。
我将我的主机系统的libpcap与android的一个进行了比较,发现了以下差异:
libpcap.a CC for Android 19 in total
pcap-linux.o
pcap-usb-linux.o
fad-gifc.o
来自我的主机系统21的libpcap.a
pcap-linux.o
pcap-usb-linux.o
pcap-can-linux.o
pcap-netfilter-linux.o
fad-getad.o
fad * .o之后的那些是相同的(至少他们的名字是)。我不知道这是由于不同的架构还是出现了问题......