【问题标题】:Android NDK: Link using a pre-compiled static libraryAndroid NDK:使用预编译的静态库进行链接
【发布时间】:2011-07-24 17:25:50
【问题描述】:

我正在尝试将 Jnetpcap 移植到 Android,以便使用它来解析 .pcap 文件。 Jnetpcap 是一个使用 JNI 的 libpcap 的 java 包装器。我已经使用 android 的源代码树将 libpcap 编译为静态库。

将 Jnetpcap 编译为共享库时出现错误,因为我必须与 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)

【问题讨论】:

    标签: android linker android-ndk static-libraries


    【解决方案1】:

    终于解决了。我的 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)
    

    【讨论】:

      【解决方案2】:

      您必须将 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)
      

      【讨论】:

      • 感谢您的帮助。我试图在我的 Android.mk 中包含 libpcap 的 Android.mk 文件,以便可以使用 libpcap。现在我收到错误,因为编译器试图在 /build/core/ 目录中查找我的源文件。我已经更新了我在此处发布的 Android.mk 文件。
      • 您不必移动您的 Android.mk 文件,只需修复指向 pcap 库的源文件和头文件的路径即可。
      • 感谢您的帮助。我已经用包含 $(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。我想也许安卓的 libpcap 版本没有。
      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多