#android #linker #android-ndk #static-libraries #libpcap
#Android #компоновщик #android-ndk #статические библиотеки #libpcap
Вопрос:
Я нашел приложение для мониторинга трафика для Android, Shark, которое основано на JnetPcap и имеет файл со всеми исходными файлами и соответствующим Android.mk файлы.
Я поместил каталог jni в файл samples Android-NDK и попытался собрать его с помощью ndk-build -C
. Во время компиляции возникают некоторые ошибки. Вот журнал ошибок, который я беру:
make: Entering directory `/home/thanasis/android-ndk-r5b/samples /jnetpcap_pure/jni'
Compile thumb : jnetpcap <= util_crc16.c
Compile thumb : jnetpcap <= util_crc32.c
Compile thumb : jnetpcap <= jnetpcap.cpp
Compile thumb : jnetpcap <= packet_flow.cpp
Compile thumb : jnetpcap <= packet_jheader.cpp
Compile thumb : jnetpcap <= jnetpcap_pcap_header.cpp
Compile thumb : jnetpcap <= nio_jbuffer.cpp
Compile thumb : jnetpcap <= winpcap_stat_ex.cpp
Compile thumb : jnetpcap <= winpcap_send_queue.cpp
Compile thumb : jnetpcap <= winpcap_ext.cpp
Compile thumb : jnetpcap <= jnetpcap_ids.cpp
Compile thumb : jnetpcap <= jnetpcap_dumper.cpp
Compile thumb : jnetpcap <= jnetpcap_utils.cpp
Compile thumb : jnetpcap <= util_in_cksum.cpp
Compile thumb : jnetpcap <= jnetpcap_beta.cpp
Compile thumb : jnetpcap <= nio_jmemory.cpp
Compile thumb : jnetpcap <= packet_jsmall_scanner.cpp
Compile thumb : jnetpcap <= packet_protocol.cpp
Compile thumb : jnetpcap <= nio_jnumber.cpp
Compile thumb : jnetpcap <= packet_jheader_scanner.cpp
Compile thumb : jnetpcap <= packet_jscan.cpp
Compile thumb : jnetpcap <= util_checksum.cpp
Compile thumb : jnetpcap <= packet_jpacket.cpp
Compile thumb : jnetpcap <= winpcap_ids.cpp
Compile thumb : jnetpcap <= util_debug.cpp
Compile thumb : jnetpcap <= jnetpcap_bpf.cpp
Compile thumb : pcap <= bpf_dump.c
Compile thumb : pcap <= bpf_filter.c
Compile thumb : pcap <= bpf_image.c
Compile thumb : pcap <= etherent.c
Compile thumb : pcap <= fad-gifc.c
Compile thumb : pcap <= gencode.c
yacc /home/thanasis/android-ndk-r5b/samples/jnetpcap_pure /jni/libpcap/grammar.y
mv -f y.tab.c /home/thanasis/android-ndk-r5b/samples/jnetpcap_pure /jni/libpcap/grammar.c
Compile thumb : pcap <= grammar.c
Compile thumb : pcap <= inet.c
Compile thumb : pcap <= nametoaddr.c
Compile thumb : pcap <= optimize.c
Compile thumb : pcap <= pcap.c
Compile thumb : pcap <= pcap-linux.c
Compile thumb : pcap <= savefile.c
Compile thumb : pcap <= scanner.c
Compile thumb : pcap <= version.c
StaticLibrary : libpcap.a
StaticLibrary : libstdc .a
SharedLibrary : libjnetpcap.so
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/obj/local /armeabi/libpcap.a(gencode.o): In function `pcap_compile':
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/jni/libpcap /gencode.c:389: undefined reference to `pcap_parse'
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/obj/local /armeabi/libpcap.a(grammar.o): In function `yyparse':
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure /jni/y.tab.c:1941: undefined reference to `yylex'
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/obj/local /armeabi/libpcap.a(scanner.o): In function `pcap_lex':
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure /jni/scanner.l:342: undefined reference to `pcap_lval'
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/obj/local /armeabi/libpcap.a(scanner.o): In function `pcap_lex':
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure /jni/<stdout>:3554: undefined reference to `pcap_lval'
collect2: ld returned 1 exit status
make: *** [/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure /obj/local/armeabi/libjnetpcap.so] Error 1
make: Leaving directory `/home/thanasis/android-ndk-r5b /samples /jnetpcap_pure/jni'
Вот Android.mk файлы:
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/jni/Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnetpcap
LOCAL_SRC_FILES :=
jnetpcap.cpp
packet_flow.cpp
packet_jheader.cpp
jnetpcap_pcap_header.cpp
nio_jbuffer.cpp
winpcap_stat_ex.cpp
winpcap_send_queue.cpp
winpcap_ext.cpp
jnetpcap_ids.cpp
jnetpcap_dumper.cpp
jnetpcap_utils.cpp
util_in_cksum.cpp
jnetpcap_beta.cpp
nio_jmemory.cpp
packet_jsmall_scanner.cpp
packet_protocol.cpp
nio_jnumber.cpp
packet_jheader_scanner.cpp
packet_jscan.cpp
util_checksum.cpp
packet_jpacket.cpp
winpcap_ids.cpp
util_debug.cpp
util_crc16.c
util_crc32.c
jnetpcap_bpf.cpp
LOCAL_C_INCLUDES :=
$(NDK_ROOT)/platforms/android-8/arch-arm/usr/include
$(LOCAL_PATH)/libpcap
LOCAL_CFLAGS := -DLIBPCAP_VERSION=0x097
LOCAL_STATIC_LIBRARIES := libpcap
include $(BUILD_SHARED_LIBRARY)
include $(LOCAL_PATH)/libpcap/Android.mk
/home/thanasis/android-ndk-r5b/samples/jnetpcap_pure/jni/libpcap/Android.mk:
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)
Как я могу решить эту проблему?
Комментарии:
1. Попробуйте рекурсивный grep, т. Е. grep -r для отсутствующего символа в дереве проекта и посмотрите, в каких исходных и объектных файлах он встречается; выясните, какой из них должен его предоставлять, и убедитесь, что он связан либо с помощью -L и -l, либо просто явно указывает объектный файл.
2. У меня такая же проблема. Вы получили какой-либо прогресс?
3. Проблема, с которой вы столкнулись, довольно проста, ИМО, ваш компоновщик не может видеть предварительно скомпилированную библиотеку в пути, проверьте пути и ваши предварительно скомпилированные данные.