Android ndk下编译libcurl

来源:互联网 发布:java达内和黑马哪个好 编辑:程序博客网 时间:2024/05/17 07:00

开发环境:Android ndk1.5_r1,cygwinm

libcurl 7.19.6 源码  下载地址 http://curl.haxx.se/

 

参考文章:http://blog.csdn.net/choujs/archive/2010/02/10/5304978.aspx

http://curl.haxx.se/mail/lib-2009-12/0071.html

 

如ndk开发一样,先刚libcurl源码放置 Android-ndk/source/sampel/ 下

在Android-ndk/apps 建相应的文件夹和application.mk    

 

对ndk不熟悉可以先参考 Android ndk开发

 

 

1.在cygwin下,进入Android-ndk/ 目录, 运行 ./configure

自动checking 。(自过程需要花一些时间请耐心等待)

 完成,自动创建相应配置文件

 

手动修改 lib/curl_config.h和src/curl_config.h,打开宏定义HAVE_LIBSSL、 HAVE_OPENSSL_CRYPTO_H、HAVE_OPENSSL_ERR_H、HAVE_OPENSSL_PEM_H、 HAVE_OPENSSL_PKCS12_H、HAVE_OPENSSL_RSA_H、HAVE_OPENSSL_SSL_H、 HAVE_OPENSSL_X509_H、USE_OPENSSL、USE_SSLEAY(但是注意android没有编译openssl中的 engine,因此不要打开宏定义HAVE_OPENSSL_ENGINE_H),同时注释掉宏定义HAVE_MALLOC_H和HAVE_IOCTL

(本段参考以上给出链接)

 

android.mk

[cpp:showcolumns] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. LOCAL_PATH:= $(call my-dir)  
  2.   
  3. common_CFLAGS := -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 -DHAVE_CONFIG_H  
  4.   
  5. #########################  
  6. # Build the libcurl library  
  7.   
  8. include $(CLEAR_VARS)  
  9. include $(LOCAL_PATH)/lib/Makefile.inc  
  10.   
  11. CURL_HEADERS := /  
  12.     curlbuild.h /  
  13.     curl.h /  
  14.     curlrules.h /  
  15.     curlver.h /  
  16.     easy.h /  
  17.     mprintf.h /  
  18.     multi.h /  
  19.     stdcheaders.h /  
  20.     typecheck-gcc.h /  
  21.     types.h  
  22.   
  23.   
  24. LOCAL_SRC_FILES := $(addprefix lib/,$(CSOURCES))  
  25. LOCAL_C_INCLUDES += $(LOCAL_PATH)/include   
  26. LOCAL_CFLAGS += /  
  27. $(common_CFLAGS) /  
  28. -I$(LOCAL_PATH)/include /  
  29. -I/usr/include  
  30.   
  31. LOCAL_COPY_HEADERS_TO := libcurl/curl  
  32. LOCAL_COPY_HEADERS := $(addprefix include/curl/,$(CURL_HEADERS))  
  33.   
  34. LOCAL_MODULE:= libcurl  
  35.   
  36. include $(BUILD_STATIC_LIBRARY)  

 

在cygwin中运行

make APP=libcurl -B

 

出现2个警告信息:

/ssluse.c: In function 'Curl_ossl_init':
/ssluse.c:632: warning: nested extern declaration of 'ENGINE_load_builtin_engines'

/strerror.c: In function 'Curl_strerror':
/strerror.c:642: warning: initialization makes pointer from integer without a cast


其他均无报错。但成功生成了libcurl.a文件。

 

测试过程:

测试中,发现IDN 的lib包始终找不到。

 

 

找了android的模拟器的lib文件下,也没有找到libidn 。所以准备重新编译libcurl.a,去掉与IDN相关的部分。

 

再次编译成功。

但在模拟器上始终得到7(Failed to connect() to host or proxy)

 

郁闷了一阵,最后发现应该在AndroidManifest.xml中

加入

    <uses-permission android:name="android.permission.INTERNET"/>

再次测试,成功得到0。

编译完成!

原创粉丝点击