web-dev-qa-db-fra.com

Android NDK: Lien utilisant une bibliothèque statique précompilée

J'essaie de porter Jnetpcap vers Android afin de l'utiliser pour analyser les fichiers .pcap. Jnetpcap est un wrapper Java pour libpcap qui utilise JNI. I ont compilé libpcap en tant que bibliothèque statique en utilisant l'arborescence du code source d'Android.

Lors de la compilation de Jnetpcap en tant que bibliothèque partagée, je reçois des erreurs car je dois créer un lien avec libpcap.a mais je ne sais pas comment dire à Android.mk qu'il doit établir un lien avec le fichier libpcap.a que j'ai.

L'utilisation de "LOCAL_STATIC_LIBRARIES: = libpcap" ne fonctionnera pas car libpcap ne vient pas par défaut dans le Android NDK.

Si vous pouviez m'aider, je vous en serais très reconnaissant.

Voici mon fichier Android.mk actuel:

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)
29
Jimix

Vous devez construire pcap comme module statique. Quelque chose comme ça

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

Ce build pcap en tant que module local que vous pouvez lier avec LOCAL_STATIC_LIBRARIES

ajoutez simplement

LOCAL_STATIC_LIBRARIES := pcap

avant d'appeler

include $(BUILD_SHARED_LIBRARY)
13
Mojo Risin

Enfin résolu. Mon 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)
43
Jimix