Android NDK:使用预编译的静态库进行链接

32

我正在尝试将Jnetpcap移植到Android上,以便用于解析.pcap文件。 Jnetpcap是libpcap的Java封装器,使用JNI。我已经使用Android源代码树编译了libpcap作为静态库。

在编译共享库时,由于必须链接libpcap.a,因此我遇到了错误,但我不知道如何告诉Android.mk它必须链接我拥有的libpcap.a文件。

使用“LOCAL_STATIC_LIBRARIES:= libpcap”无法正常工作,因为libpcap不包含在Android NDK中。

如果您能帮助我,我将不胜感激。

这是我当前的Android.mk文件:

include /home/sergio/workspace/MyApp/jni/libpcap/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\
    library.cpp\
    packet_jscan.cpp\
    jnetpcap_pcap100.cpp\
    util_checksum.cpp\
    packet_jpacket.cpp\
    winpcap_ids.cpp\
    jnetpcap_bpf.cpp

LOCAL_C_INCLUDES := /home/sergio/android-ndk-r5b/platforms/android-8/arch-arm/usr/include /home/sergio/workspace/Shark/jni/libpcap

LOCAL_STATIC_LIBRARIES := libpcap

include $(BUILD_SHARED_LIBRARY)
2个回答

44

终于解决了。我的 Android.mk 代码:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libpcap 
LOCAL_SRC_FILES := libpcap.a

include $(PREBUILT_STATIC_LIBRARY)


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\
    library.cpp\
    packet_jscan.cpp\
    jnetpcap_pcap100.cpp\
    util_checksum.cpp\
    packet_jpacket.cpp\
    winpcap_ids.cpp\
    jnetpcap_bpf.cpp

LOCAL_C_INCLUDES :=\
    /home/sergio/android-ndk-r5b/platforms/android-8/arch-arm/usr/include\
    /home/sergio/workspace/MyApp/jni/libpcap

LOCAL_STATIC_LIBRARIES := libpcap

include $(BUILD_SHARED_LIBRARY)

13

你需要将pcap构建为静态模块。类似这样:

include $(CLEAR_VARS)
LOCAL_MODULE := pcap
LOCAL_CFLAGS := declare_flags
LOCAL_C_INCLUDES := declare_include
LOCAL_SRC_FILES := src_files
include $(BUILD_STATIC_LIBRARY)

这将构建 pcap 为本地模块,您可以将其与 LOCAL_STATIC_LIBRARIES 链接

只需添加:

LOCAL_STATIC_LIBRARIES := pcap

调用之前

include $(BUILD_SHARED_LIBRARY)

感谢您的帮助。我尝试将libpcap的Android.mk文件包含在我的Android.mk中,以便我可以使用libpcap。现在我遇到了错误,因为编译器正在尝试在<ndk root>/build/core/目录中查找我的源文件。我已经更新了我在这里发布的Android.mk文件。 - Jimix
你不需要移动Android.mk文件,只需修复路径指向pcap库的源文件和头文件即可。 - Mojo Risin
谢谢你的帮助。我已经通过包含$(PREBUILT_STATIC_LIBRARY)来解决了它。似乎我遇到的错误并不是由于没有链接libpcap引起的。编译器说一些函数在此范围内未声明:pcap_create、pcap_activate、pcap_can_set_rfmon、pcap_set_buffer_size、pcap_set_promisc、pcap_set_snaplen、pcap_set_timeout。我认为可能是Android版本的libpcap没有这些函数。 - Jimix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接