一、总体概览

C库:libcurl 3.7

目标平台:android

编译平台:ubuntu 12

编译工具:ndk r7 or later

二、已知方法

1. 官网上给了两种方法,第一种方法是使用android源代码来一块编译,原文如下:

Method using the static makefile:
      see the build notes in the packages/Android/Android.mk file.

Android.mk如下:

# Google Android makefile for curl and libcurl

#

# This file can be used when building curl using the full Android source

# release or the NDK. Most users do not want or need to do this; please

# instead read the Android section in docs/INSTALL for alternate

# methods.

#

# Place the curl source (including this makefile) into external/curl/ in the

# Android source tree.  Then build them with 'make curl' or just 'make libcurl'

# from the Android root. Tested with Android versions 1.5, 2.1-2.3

#

# Note: you must first create a curl_config.h file by running configure in the

# Android environment. The only way I've found to do this is tricky. Perform a

# normal Android build with libcurl in the source tree, providing the target

# "showcommands" to make. The build will eventually fail (because curl_config.h

# doesn't exist yet), but the compiler commands used to build curl will be

# shown. Now, from the external/curl/ directory, run curl's normal configure

# command with flags that match what Android itself uses. This will mean

# putting the compiler directory into the PATH, putting the -I, -isystem and

# -D options into CPPFLAGS, putting the -W, -m, -f, -O and -nostdlib options

# into CFLAGS, and putting the -Wl, -L and -l options into LIBS, along with the

# path to the files libgcc.a, crtbegin_dynamic.o, and ccrtend_android.o.

# Remember that the paths must be absolute since you will not be running

# configure from the same directory as the Android make.  The normal

# cross-compiler options must also be set. Note that the -c, -o, -MD and

# similar flags must not be set.

#

# To see all the LIBS options, you'll need to do the "showcommands" trick on an

# executable that's already buildable and watch what flags Android uses to link

# it (dhcpcd is a good choice to watch). You'll also want to add -L options to

# LIBS that point to the out/.../obj/lib/ and out/.../obj/system/lib/

# directories so that additional libraries can be found and used by curl.

#

# The end result will be a configure command that looks something like this

# (the environment variable A is set to the Android root path which makes the

# command shorter):

#

#  A=`realpath ../..` && \

#  PATH="$A/prebuilt/linux-x86/toolchain/arm-eabi-X/bin:$PATH" \

#  ./configure --host=arm-linux CC=arm-eabi-gcc \

#  CPPFLAGS="-I $A/system/core/include ..." \

#  CFLAGS="-nostdlib -fno-exceptions -Wno-multichar ..." \

#  LIBS="$A/prebuilt/linux-x86/toolchain/arm-eabi-X/lib/gcc/arm-eabi/X\

#  /interwork/libgcc.a ..."

#

# Finally, copy the file COPYING to NOTICE so that the curl license gets put

# into the right place (but see the note about this below).

3. 第二中方法使用 android ndk的脚本自己定制一套工具链,方便配置变量

Method using a configure cross-compile (tested with Android NDK r7c, r8):
      prepare the toolchain of the Android NDK for standalone use; this can be done by invoking the script:
        ./build/tools/make-standalone-toolchain.sh
     which creates a usual cross-compile toolchain. Lets assume that you put this toolchain below /opt then invoke configure with something like:
        export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH
        ./configure --host=arm-linux-androideabi [more configure options]
        make

三、自己方法

第一种方法需要用到android源代码,很不方便;第二种需要配置很多configure参数才能保证make成功。我的方法是结合了以上两种方法,用./configure得到curl_config.h等文件,然后使用ndk-build来编译Android.mk,而不是直接用make.

1. 搭建NDK环境:

1.1 下载NDK

官网下载页:http://developer.android.com/tools/sdk/ndk/index.html下载下来后,解压缩

注:下载符合你操作系统位数的ndk;还有就是下载ndk32的,因为android的64位支持没多久,大部分还都是32位的;版本越新越好,新版本会修复很多编译器bug,支持更多的语言特性。

1.2 配置NDK环境参数

打开 ~/.bashrc文件:

export NDK_HOME=~/Android /android-ndk-r8

export PATH=$PATH:$NDK_HOME

export PATH=$PATH:$NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux/bin

测试一下

ndk-build –v

注1:修改环境变量的方法有三种,但是以上这种关机后不会失效:

比如要把/etc/apache/bin目录添加到PATH中

  1. #PATH=$PATH:/etc/apache/bin

  使用这种方法,每当登出PATH就会恢复

  2. #vi /etc/profile

  在适当位置添加PATH=$PATH:/etc/apache/bin

  这种方法最好,除非你强制手动修改PATH的值,否则将不会被改变

  3. #vi ~/.bash_profile

  修改PATH行,把/etc/apache/bin添加进去

  这种方法是针对用户起作用的

注2:ndk-build使用有两种方法

  1. cd ~/android-ndk-r9/samples/hello-jni/jni

ndk-build

  2. $NDK_HOME/ndk-build  -C ~/android-ndk-r9/samples/hello-jni/jni

用 -C 指出工程目录路径

2.    配置和编译libcurl

2.1   下载源代码http://curl.haxx.se/download.html,解压

2.2   命令行进入curl目录后,执行

./configure –host=arm-linux-androideabi

注:记住host一定是工具链前缀

2.3   把package/android/Android.mk修改一下,去掉后边的可执行文件相关的语句,我们只要生成静态库就行了。然后把package/android改为package/jni

注:文件结构必须是jni/Android.mk,否则ndk-build找不到。

2.4   命令行进入package,执行ndk-build,大功告成。

libcurl移植到android的更多相关文章

  1. Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)

    这节我们来学习Cocos2d-x的最后一节.怎样处理重力感应事件.移植到Android后加入再按一次返回键退出游戏等.我这里用的Android.IOS不会也没设备呃 效果图不好弄,由于是要移植到真机上 ...

  2. Cocos移植到Android的一些问题-中文乱码问题

    Android平台版本和设备碎片化很严重,因此从Win32平台移植到Android平台会有很多问题,下面是我们归纳的从Win32平台移植到Android平台遇到的一些问题.在Android平台中文乱码 ...

  3. 将Unity3D游戏移植到Android平台上

    将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...

  4. iperf linux版本移植到android (使用工具链方式不是使用Android.mk)

    由于很多程序是用makefile编译linux应用程序的,如果移植到android就要重新写Android.mk,对于不熟悉这个的人来说,特别麻烦,所以这里介绍只修改makefile就能移植到andr ...

  5. Windows下将ImageMagick移植到Android平台

    Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...

  6. React Native移植原生Android

    (一)前言 之前已经写过了有关React Native移植原生Android项目的文章,不过因为RN版本更新的原因吧,跟着以前的文章可能会出现一些问题,对于初学者来讲还是会有很多疑难的困惑的,而且官方 ...

  7. ffmpeg 移植到 android 并使用

    同步更新至个人blog:http://dxjia.cn/2015/07/ffmpeg-porting-to-android/ 空闲做了个小应用,从视频里截图,然后再将截图拼接为一个gif动画: 起初使 ...

  8. 基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

    一.版本迁移中的问题 1.游戏元素Sprite.Label.Action等等的创建函数名都改为create. 2.函数的回调callfunc_selectorcallfuncN_selectorcal ...

  9. libxml移植到android

    libxml是C语言写的xml解析库,是我们开发可移植程序的首选,下面讲述将其移植到android的步骤 1.下载已经配置好的源代码包android_libxml2.rar http://pan.ba ...

随机推荐

  1. [shell] sed学习

    Q:匹配内容有1没有a的行 echo -e "1a\n2b\n1b\n2a" | sed -n '/1/{/a/d;p}' echo -e "1a\n2b\n1b\n2a ...

  2. LeetCode 888. Fair Candy Swap(C++)

    题目: Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that ...

  3. 20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 05

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2413] 版本控制地址    [https://git.coding.ne ...

  4. git中的重要指令

    git命令 任何操作都需要以 git 命令为开头 本地操作: git init 初始化一个本地仓库 新建为 master主分支 git status 查看当前分支状态 git add <文件名& ...

  5. Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp

    题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...

  6. lintcode-65-两个排序数组的中位数

    65-两个排序数组的中位数 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n)). 样例 给出数组A = [1,2,3,4,5,6] B = [ ...

  7. Java实现的词频统计——功能改进

    本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...

  8. 控件属性和InitializeComponent()关系:

    namespace Test22 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> priv ...

  9. saltstack基础篇

    使用saltstack的前提是PPT      服务.流程.工具和技术 安装 rpm -Uvh http://mirrors.yun-idc.com/epel/6Server/x86_64/epel- ...

  10. 【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

    1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据 ...