简体   繁体   English

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

[英]Android NDK: Link using a pre-compiled static library

I'm trying to port Jnetpcap to Android in order to use it for parsing .pcap files. 我正在尝试将Jnetpcap移植到Android,以便将其用于解析.pcap文件。 Jnetpcap is a java wrapper for libpcap which uses JNI. Jnetpcap是libpcap的java包装器,它使用JNI。 I have compiled libpcap as a static library using the android's source code tree. 我已经使用android的源代码树将libpcap编译为静态库。

When compiling Jnetpcap as a shared library I'm getting errors because I have to link with libpcap.a but I don't know how could I tell Android.mk that he must link with the libpcap.a file that I have. 当编译Jnetpcap作为共享库时,我遇到错误,因为我必须链接libpcap.a但我不知道怎么能告诉Android.mk他必须链接到我拥有的libpcap.a文件。

Using "LOCAL_STATIC_LIBRARIES:= libpcap" won't work because libpcap doesn't come by default in the android NDK. 使用“LOCAL_STATIC_LIBRARIES:= libpcap”将无法正常工作,因为在android NDK中默认不提供libpcap。

If any of you guys could help me I would be very thankful. 如果你们中的任何人能帮助我,我会非常感激。

Here is my current Android.mk file: 这是我当前的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)

Finally solved it. 终于解决了。 My Android.mk code: 我的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)

You have to build pcap as static module. 您必须将pcap构建为静态模块。 Something like this 像这样的东西

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

This build pcap as local module which you could link with LOCAL_STATIC_LIBRARIES 这可以将pcap构建为本地模块,您可以使用LOCAL_STATIC_LIBRARIES进行链接

just add 加上

LOCAL_STATIC_LIBRARIES := pcap

before calling 在打电话之前

include $(BUILD_SHARED_LIBRARY)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM