curl对android提供了支持,在curl的代码根目录中有相应的makefile文件Android.mk。使用libcrul必须先对curl进行交叉编译
一、curl的交叉编译:
1、编译android源代码。编译方法参考http://source.android.com。
2、在android源码中编译curl,从http://curl.haxx.se/download.html下载curl源码,解压到external/curl目录。
3、在external/curl目录中进行configure,(红色字部分根据自己的环境做相应的更改)
ANDROID_ROOT=`realpath /android/source/` && \
TOOLCHAIN_VER="4.4.0" \
PLATFORM_VER="8" \
CROSS_COMPILE=arm-eabi- \
PATH=$ANDROID_ROOT/prebuilt/linux-x86/toolchain/arm-eabi-$TOOLCHAIN_VER/bin:$PATH && \
CPPFLAGS="-I $ANDROID_ROOT/system/core/include -I$ANDROID_ROOT/bionic/libc/include -I$ANDROID_ROOT/ndk/build/platforms/android-5/arch-arm/usr/include -I$ANDROID_ROOT/bionic/libc/kernel/arch-arm -L $ANDROID_ROOT/prebuilt/linux-x86/toolchain/arm-eabi-$TOOLCHAIN_VER/lib/gcc/arm-eabi/$TOOLCHAIN_VER/interwork
-L$ANDROID_ROOT/ndk/build/platforms/android-$PLATFORM_VER/arch-arm/usr/lib -L$ANDROID_ROOT/out/target/product/generic/system/lib " \
CFLAGS="-fno-exceptions -Wno-multichar -mthumb -mthumb-interwork -nostdlib -lc -ldl -lm " \
./configure CC=arm-eabi-gcc --host=arm-linux --disable-tftp --disable-sspi --disable-ipv6 --disable-ldaps --disable-ldap --disable-telnet --disable-pop3 --disable-ftp --without-ssl --disable-imap --disable-smtp --disable-pop3 --disable-rtsp --disable-ares --without-ca-bundle
--disable-warnings --disable-manual --without-nss --enable-shared --without-zlib --without-random
如果需要openssl或zlib,可以把configure参数改为
./configure CC=arm-eabi-gcc --host=arm-linux --disable-tftp --disable-sspi --disable-ipv6 --disable-ldaps --disable-ldap --disable-telnet --disable-pop3 --disable-ftp --with-ssl=$ANDROID_ROOT/external/openssl --disable-imap --disable-smtp --disable-pop3 --disable-rtsp
--disable-ares --without-ca-bundle --disable-warnings --disable-manual --without-nss --enable-shared --with-zlib=$ANDROID_ROOT/external/zlib --without-random
4、进入ANDROID_ROOT目录,执行source build/envsetup.sh,如果需要编译curl 执行make curl,或者仅编译libcurl make libcurl
5、如果要生成动态库需要修改curl下的Android.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)
二、在jni中使用libcurl
1、在android源码目录中创建一个带jni的应用。
2、把libcurl的头文件拷贝到jni目录,在jni目录下创建3rd/include目录:
cp -r $ANDROID_ROOT/out/target/product/generic/obj/include/libcurl/curl/ jni/3rd/include
3、修改jni目录下的Android.mk文件,实例如下
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
$(LOCAL_PATH) \
$(LOCAL_PATH)/3rd/include \
LOCAL_PRELINK_MODULE:=false
LOCAL_STATIC_LIBRARIES := libcurl
LOCAL_MODULE:= libXXXXXX
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
4、事例代码如下:
#include "curl/curl.h"
#include <stdlib.h>
typedef struct pageInfo_t {
char *data;
int len;
} pageInfo_t;
static size_t
HTTPData(void *buffer, size_t size, size_t nmemb, void *userData) {
int len = size * nmemb;
pageInfo_t *page = (pageInfo_t *)userData;
if (buffer && page->data && (page->len + len < (16 * 1024)) ) { memcpy(&page->data[page->len], buffer, len);
page->len += len;
}
return len;
}
void curltest()
{
pageInfo_t page;
CURL *curl;
CURLcode res;
char *buffer;
page.data = (char *)malloc(16 * 1024);
page.len = 0;
if (page.data)
memset(page.data, 32, 16 * 1024);
buffer = (char *)malloc(1024);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://baihexss.sinaapp.com/plugin.html");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
if(res == 0) {
if (buffer) {
page.data[page.len < 256 ? page.len : 256] = '\0';
LOG("pagedata(%d): %s. done.\n", page.len, page.data);
}
}
LOG("Result %d", res);
} else {
LOG("Unable to init cURL");
}
}
5、在应用代码根目录执行mm编译,最后输出
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.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=FRG83G
============================================
make: Entering directory `/android/source'
target Non-prelinked: lib***** (out/target/product/generic/symbols/system/lib/lib*****.so)
Copying: out/target/common/obj/APPS/*****_intermediates/classes-full-debug.jar
Install: out/target/product/generic/data/app/*****.apk
Copy: out/target/product/generic/system/etc/apns-conf.xml
make: Leaving directory `/android/source'
6、把out/target/product/generic/data/app/*****.apk安装执行即可看到结果
备注:
开发环境: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
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
LOCAL_PATH:=$(callmy-dir)
-
-
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
-
-
#########################
-
#Buildthelibcurllibrary
-
-
include$(CLEAR_VARS)
-
include$(LOCAL_PATH)/lib/Makefile.inc
-
-
CURL_HEADERS:=/
-
curlbuild.h/
-
curl.h/
-
curlrules.h/
-
curlver.h/
-
easy.h/
-
mprintf.h/
-
multi.h/
-
stdcheaders.h/
-
typecheck-gcc.h/
-
types.h
-
-
-
LOCAL_SRC_FILES:=$(addprefixlib/,$(CSOURCES))
-
LOCAL_C_INCLUDES+=$(LOCAL_PATH)/include
-
LOCAL_CFLAGS+=/
-
$(common_CFLAGS)/
-
-I$(LOCAL_PATH)/include/
-
-I/usr/include
-
-
LOCAL_COPY_HEADERS_TO:=libcurl/curl
-
LOCAL_COPY_HEADERS:=$(addprefixinclude/curl/,$(CURL_HEADERS))
-
-
LOCAL_MODULE:=libcurl
-
-
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。
编译完成!
分享到:
相关推荐
libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证。 PHP自带curl扩展,但java没有curl扩展,这个工程的目的,就是将...
android studio 中jni的简单使用,适合初学jni者参考
JNI 代码开发指南,提供java开发人员开发调用C语言函数库的方法
JNI开发 eclipse相关开发环境的搭建
解决JNI中文乱码,
Android中JNI的使用方法,JNI的开发使用方法,SDK开发
JNI&FNDK; 开发指南 - v1.0JNI&FNDK; 开发指南 - v1.0JNI&FNDK; 开发指南 - v1.0JNI&FNDK; 开发指南 - v1.0
Android JNI 开发 步骤 , 绝对详细
JNI技术在嵌入式软件开发中应用学些笔记
java中RCP中使用JNI
JNI开发步骤
多部经典java JNI教程,含中文教程,网上最全的JNI资料大合集!android开发必备的资料,全面教您掌握JNI,让你在android下用C语言也可轻松开发。好不容易搜集来的资料!
使用JNI开发音频转码器
说明:作为Java程序员,当与c程序员进行联合开发时会使用到JNI编程技术。此时要求Java程序员必须要会使用dll文档,以使用调试Java代码。这里介绍使用Windows OS自带的c/c++编译器(cl)怎样把.c文档编译成.exe和.dll...
通过JNI调用本地DLL,并传递中文字符串, Visual C++ 6.0 开发DLL 原创作品,随意转载,提前请说明!
本程序是在Eclipse中创建的一个Android Application,该项目中是在JNI中利用OpenGL ES库和OpenCV库进行一副图片的渲染。
DELPHI开发JNI必备 jni.pas 包含文件 jni.pas JNI_MD.INC
一个简单的android JNI 开发范例. 可以做入门学习之用
JNI开发
android jni使用curl进行http请求和文件下载,具体说明参考博客 http://blog.csdn.net/csdn49532/article/details/50680716