Parsing the migration compilation and testing of libcurl under android

  • 2020-05-10 18:50:02
  • OfStack

Since the project needs to use network development in NDK, the libcurl library is a good choice for network development in c language, but the android system does not come with the library, so you have to port it yourself.
Here are the migration steps:
1.   download curl source code
I am here to download curl - 7.22.0, source code download address is: http: / / curl haxx. se/download html

2. Prepare the android source code compilation environment,
The android source code should have been fully compiled, the details here are not detailed, I use the android2.2 froyo source tree.

3.   compiles curl in android
The curl source code actually contains the Android.mk compiler file, and the compilation method is described in more detail in the comments section at the beginning of the file.
1) copy the curl source code to external/curl under the android source tree
2) from cd to external/curl, enter (the red part will be changed according to your own environment) :


ANDROID_HOME=/home/braincol/workspace/android/froyo && \
NDK_HOME=/home/braincol/workspace/android/froyo/ndk && \
PATH="$ANDROID_HOME/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin:$PATH" \
./configure --host=arm-linux CC=arm-eabi-gcc --with-random=/dev/urandom \
CPPFLAGS="-I$NDK_HOME/platforms/android-8/arch-arm/usr/include \
-I $ANDROID_HOME/external/curl/include/  \
-I $ANDROID_HOME/external/curl/3rd/include   \
-I $ANDROID_HOME/external/curl   \
-I $ANDROID_HOME/out/target/product/generic/obj/STATIC_LIBRARIES/libcurl_intermediates   \
-I $ANDROID_HOME/dalvik/libnativehelper/include/nativehelper   \
-I $ANDROID_HOME/system/core/include   \
-I $ANDROID_HOME/hardware/libhardware/include   \
-I $ANDROID_HOME/hardware/libhardware_legacy/include   \
-I $ANDROID_HOME/hardware/ril/include   \
-I $ANDROID_HOME/dalvik/libnativehelper/include   \
-I $ANDROID_HOME/frameworks/base/include   \
-I $ANDROID_HOME/frameworks/base/opengl/include   \
-I $ANDROID_HOME/frameworks/base/native/include   \
-I $ANDROID_HOME/external/skia/include   \
-I $ANDROID_HOME/out/target/product/generic/obj/include   \
-I $ANDROID_HOME/bionic/libc/arch-arm/include   \
-I $ANDROID_HOME/bionic/libc/include   \
-I $ANDROID_HOME/bionic/libstdc++/include   \
-I $ANDROID_HOME/bionic/libc/kernel/common   \
-I $ANDROID_HOME/bionic/libc/kernel/arch-arm   \
-I $ANDROID_HOME/bionic/libm/include   \
-I $ANDROID_HOME/bionic/libm/include/arch/arm   \
-I $ANDROID_HOME/bionic/libthread_db/include \
-include $ANDROID_HOME/system/core/include/arch/linux-arm/AndroidConfig.h \
-I $ANDROID_HOME/system/core/include/arch/linux-arm/ \
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DNDEBUG -DNDEBUG -DHAVE_CONFIG_H" \
CFLAGS="-fno-exceptions -Wno-multichar -msoft-float -fpic -ffunction-sections \
-funwind-tables -fstack-protector -Wa,--noexecstack -Werror=format-security \
-fno-short-enums -march=armv5te -mtune=xscale  -Wno-psabi -mthumb-interwork  \
-fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith \
-Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point  \
-g -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once \
-fgcse-after-reload -frerun-cse-after-loop -frename-registers  -UDEBUG \
-mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64   \
-Wpointer-arith -Wwrite-strings -Wunused -Winline -Wnested-externs \
-Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal \
-Wno-multichar -Wsign-compare -Wno-format-nonliteral -Wendif-labels \
-Wstrict-prototypes -Wdeclaration-after-statement -Wno-system-headers"  \
LIBS="-nostdlib -Bdynamic -Wl,-T,$ANDROID_HOME/build/core/armelf.x \
-Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc \
-L$ANDROID_HOME/out/target/product/generic/obj/lib -Wl,-z,noexecstack \
-Wl,-rpath-link=$ANDROID_HOME/out/target/product/generic/obj/lib \
-lc -llog -lcutils -lstdc++ \
-Wl,--no-undefined $ANDROID_HOME/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/libgcc.a  \
$ANDROID_HOME/out/target/product/generic/obj/lib/crtend_android.o \
-lm $ANDROID_HOME/out/target/product/generic/obj/lib/crtbegin_dynamic.o \
-L$ANDROID_HOME/external/curl/3rd/libs"

If the ndk development kit is not available in the $ANDROID_HOME directory, download one from the google website and put it in.

3) cd to the source root directory mmm extern/libcurl:
Compilation is completed, will generate static library: out/target/product/generic/obj/STATIC_LIBRARIES/libcurl_intermediates/libcurl a  .

4) if you want to generate dynamic library, you need to modify Android under curl.mk:

LOCAL_PRELINK_MODULE := false 
LOCAL_MODULE:= libcurl 
LOCAL_MODULE_TAGS := optional 
# Copy the licence to a place where Android will find it. 
# Actually, this doesn't quite work because the build system searches 
# for NOTICE files before it gets to this point, so it will only be seen 
# on subsequent builds. 
ALL_PREBUILT += $(LOCAL_PATH)/NOTICE 
$(LOCAL_PATH)/NOTICE: $(LOCAL_PATH)/COPYING | $(ACP) 
$(copy-file-to-target) 
#include $(BUILD_STATIC_LIBRARY) 
include $(BUILD_SHARED_LIBRARY)

4.   tests curl in android
1) create one mytest directory under the android froyo source tree, and another curltest directory under the android froyo source tree.
2) create curl-test.cpp under the directory curtest:

#include
 "curl/curl.h"#include
 <stdio.h>;int
main() {     CURL
 *curl;     CURLcode
 res;     curl_global_init(CURL_GLOBAL_ALL);     curl
 = curl_easy_init();    if
(curl) {             curl_easy_setopt(curl,
 CURLOPT_URL, "http://www.cnblogs.com/hibraincol/");
        res
 = curl_easy_perform(curl);         if
(0!=res) {                  printf("curl
 error: %d\n",
 res);                 }                 curl_easy_cleanup(curl);    
    }  
     curl_global_cleanup();    return
0;}

3) create Android.mk under the directory curtest:

#
 curl test executable#LOCAL_PATH
 := $(call my-dir)include
 $(CLEAR_VARS) LOCAL_C_INCLUDES
 += \    $(LOCAL_PATH)/3rd/include LOCAL_SRC_FILES:=
 curl-test.cpp #
 No shared libraries.LOCAL_SHARED_LIBRARIES
 := #
 No static libraries.LOCAL_STATIC_LIBRARIES
 := libcurl LOCAL_MODULE
 := curl-testinclude
 $(BUILD_EXECUTABLE)

4) copy the libcurl header file into the curtest directory in the 3rd/include directory:
cp -rf out/target/product/generic/obj/include/libcurl/curl   mytest/curltest/3rd/include
5) go to the root directory of the android source tree: mmm /mytest/curltest/

braincol@ubuntu:~/workspace/android/froyo$ mmm mytest/curltest/ 
============================================ 
PLATFORM_VERSION_CODENAME=REL 
PLATFORM_VERSION=2.2 
TARGET_PRODUCT=generic 
TARGET_BUILD_VARIANT=eng 
TARGET_SIMULATOR= 
TARGET_BUILD_TYPE=release 
TARGET_BUILD_APPS= 
TARGET_ARCH=arm 
HOST_ARCH=x86 
HOST_OS=linux 
HOST_BUILD_TYPE=release 
BUILD_ID=MASTER 
============================================ 
make: Entering directory `/home/braincol/workspace/android/froyo' 
target thumb C++: curl-test <= mytest/curltest/curl-test.cpp 
mytest/curltest/curl-test.cpp:2:19: warning: extra tokens at end of #include directive 
target Executable: curl-test (out/target/product/generic/obj/EXECUTABLES/curl-test_intermediates/LINKED/curl-test) 
target Non-prelinked: curl-test (out/target/product/generic/symbols/system/bin/curl-test) 
target Strip: curl-test (out/target/product/generic/obj/EXECUTABLES/curl-test_intermediates/curl-test) 
Install: out/target/product/generic/system/bin/curl-test 
make: Leaving directory `/home/braincol/workspace/android/froyo' 

Can be seen in out target/product generic/system/bin/laying into curl - test the test program.
6) copy curl-test into a real machine or emulator for running.
  a. I have created an test directory in the root directory of the android real machine.
  b. Then copy curl-test to this directory via adb push and change curl-test to an executable permission: chmod 777 curl-test.
  c.adb shell enter the shell console, then cd to test directory./ curl-test  
 
In this way, if the android app library is needed later in the android app development, Can directly out/target/product/generic obj/include/libcurl/curl header files and out/target/product/generic/obj/STATIC_LIBRARIES/libcurl_intermediates/libcurl a to app engineering use.


Related articles: