Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 is a java wrapper for libpcap which uses JNI. I have compiled libpcap as a static library using the android's source code tree.

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.

Using "LOCAL_STATIC_LIBRARIES:= libpcap" won't work because libpcap doesn't come by default in the android NDK.

If any of you guys could help me I would be very thankful.

Here is my current Android.mk file:

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) 
like image 417
Jimix Avatar asked Mar 28 '11 18:03

Jimix


2 Answers

Finally solved it. My Android.mk code:

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) 
like image 115
Jimix Avatar answered Oct 06 '22 02:10

Jimix


You have to build pcap as static module. 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

just add

LOCAL_STATIC_LIBRARIES := pcap 

before calling

include $(BUILD_SHARED_LIBRARY) 
like image 45
Mojo Risin Avatar answered Oct 06 '22 02:10

Mojo Risin