1. 程式人生 > >Ubuntu+NDK編譯支援HTTPS的libcurl

Ubuntu+NDK編譯支援HTTPS的libcurl

參考文章:
1.NDK環境配置 http://blog.csdn.net/smfwuxiao/article/details/6587709
2.libcurl的配置修改 http://piggyq.com/pen/compile-libcurl-and-openssl-on-android-using-ndk.html

假設已經編譯好了openssl,並且安裝目錄(標頭檔案和庫的所在的目錄)為openssl-android

第一步:配置NDK環境(包括系統環境SYSROOT和編譯器CC)
android ndk 提供指令碼,允許自己定製一套工具鏈。例如:
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain [ --arch=x86 ]
將會在/tmp/my-android-toolchain 中建立 sysroot 環境和 工具鏈。--arch 選項選擇目標程式的指令

架構,預設是為 arm。
如果不加 --install-dir 選項,則會建立 /tmp/ndk/<toolchain-name>.tar.bz2。
(執行 make-standalone-toolchain.sh --help 檢視幫助。)
執行之後,這樣使用:
$ export PATH=/tmp/my-android-toolchain/bin:$PATH
$ export CC=arm-linux-androideabi-gcc
$ export CXX=arm-linux-androideabi-g++
$ export CXXFLAGS="-lstdc++"
執行完以上設定環境變數
的命令之後,就可以直接編譯了(例如,執行 ./configure 然後 make 得到的就是 arm 程式了)。
不用再設定 sysroot, CC 了。而且,可以使用 STL,異常,RTTI。

第二步:配置libcurl
進入curl根目錄,執行./configure --host=arm-linux-androideabi --with-ssl=/openssl-android
為了保證生成的配置檔案正確,需要手動確認一下,開啟lib/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中的 ,因此不要開啟巨集定義HAVE_OPENSSL_ENGINE_H),
同時註釋掉巨集定義HAVE_MALLOC_H和HAVE_IOCTL, 這兩個巨集定義在Android_config.h中有定義,
不註釋的話在編譯過程中會有很多警告(但是能正確編譯通過)

第三步:編譯Libcurl
修改Android.mk,刪除我們不需要的curl模組,在LOCAL_C_INCLUDES變數的值中增加openssl-android/include和openssl-android/crypto.
再按照以下幾種方式修改Android.mk.修改完後,將所在目錄package/Android改為package/jni,使用終端進入package,然後執行ndk-build即可。
1.編譯ARM版的(依賴openssl的共享庫)
先在libcurl前增加動態庫模組,使libssl.so等拷貝到正確位置,如下。
LOCAL_PATH:= $(call my-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

#using libssl.so
include $(CLEAR_VARS) 
LOCAL_MODULE := libssl
LOCAL_SRC_FILES := /home/administrator/openssl-android/libs/armeabi/libssl.so 
include $(PREBUILT_SHARED_LIBRARY)

#using libcrypto.so
include $(CLEAR_VARS) 
LOCAL_MODULE := libcrypto
LOCAL_SRC_FILES :=/home/administrator/openssl-android/libs/armeabi/libcrypto.so 
include $(PREBUILT_SHARED_LIBRARY)

# Build the libcurl library

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

LOCAL_SRC_FILES := $(addprefix lib/,$(CSOURCES))
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/\
$(LOCAL_PATH)/lib/\
$(LOCAL_PATH)/../openssl-android/include/\
$(LOCAL_PATH)/../openssl-android/crypto/
LOCAL_SYSTEM_SHARED_LIBRARIES+= libssl libcrypto libz
LOCAL_CFLAGS += $(common_CFLAGS)

LOCAL_COPY_HEADERS_TO := libcurl/curl
LOCAL_COPY_HEADERS := $(addprefix include/curl/,$(CURL_HEADERS))

LOCAL_MODULE:= libcurl
LOCAL_MODULE_TAGS := optional

ALL_PREBUILT += $(LOCAL_PATH)/NOTICE
$(LOCAL_PATH)/NOTICE: $(LOCAL_PATH)/COPYING | $(ACP)
$(copy-file-to-target)

include $(BUILD_STATIC_LIBRARY)

2.編譯ARM版的(依賴Openssl的靜態庫)
Android.mk修改與3類似,稍微改一下靜態庫路徑即可


3.編譯x86版的(依賴openssl靜態庫)

修改Android.mk
LOCAL_PATH:= $(call my-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

include $(CLEAR_VARS) 
LOCAL_MODULE := libssl
LOCAL_SRC_FILES := /home/administrator/openssl-android/obj/local/x86/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS) 
LOCAL_MODULE := libcrypto
LOCAL_SRC_FILES :=/home/administrator/openssl-android/obj/local/x86/libcrypto.a 
include $(PREBUILT_STATIC_LIBRARY)
#########################
# Build the libcurl library

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

LOCAL_SRC_FILES := $(addprefix lib/,$(CSOURCES))
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/\
$(LOCAL_PATH)/lib/\
$(LOCAL_PATH)/../openssl-android/include/\
$(LOCAL_PATH)/../openssl-android/crypto/
LOCAL_STATIC_LIBRARIES += libssl libcrypto
LOCAL_SYSTEM_SHARED_LIBRARIES += libz
LOCAL_CFLAGS += $(common_CFLAGS)

LOCAL_COPY_HEADERS_TO := libcurl/curl
LOCAL_COPY_HEADERS := $(addprefix include/curl/,$(CURL_HEADERS))

LOCAL_MODULE:= libcurl
LOCAL_MODULE_TAGS := optional

ALL_PREBUILT += $(LOCAL_PATH)/NOTICE
$(LOCAL_PATH)/NOTICE: $(LOCAL_PATH)/COPYING | $(ACP)
$(copy-file-to-target)

include $(BUILD_STATIC_LIBRARY)

在Android.mk的同目錄中增加Application.mk,並增加以下內容:
APP_ABI := x86

TARGET_ARCH := x86

------------------------------------------------------------------------------------------------------------------------------------------------

export LDFLAGS="\-L/usr/local/Cellar/android-ndk/r8e/platforms/android-14/arch-arm/usr/lib"

export CPPFLAGS="\-I/usr/local/Cellar/android-ndk/r8e/platforms/android-14/arch-arm/usr/include"

./configure --host=arm-linux-androideabi \--disable-ftp \--disable-gopher \--disable-file \--disable-imap \--disable-ldap \--disable-ldaps \--disable-pop3 \--disable-proxy \--disable-rtsp \--disable-smtp \--disable-telnet \--disable-tftp \--without-gnutls \--without-libidn \--without-librtmp \--without-ssl \--disable-dict

make

生成的靜態庫檔案位於:lib/.libs/libcurl.a 動態庫:libcurl.so.5.3.0

一般我們使用靜態庫檔案。

複製 libcurl.a 到專案 jni/ 目錄,修改 Android.mk 檔案

# A simple test for the minimal standard C++ library

#LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)LOCAL_MODULE := curl

LOCAL_SRC_FILES := libcurl.a

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_CFLAGS = -Wno-psabi

LOCAL_MODULE := curltest

LOCAL_SRC_FILES := curltest.c

LOCAL_STATIC_LIBRARIES := libcurl

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

LOCAL_LDLIBS += -lz

---------------------------------------------------------------------------------------------------------------------------------------------

https://zhigang.net/2013/08/yi-zhi-libcurldao-android-ndk.html


http://piggyq.com/pen/compile-libcurl-and-openssl-on-android-using-ndk.html


http://www.bubuko.com/infodetail-557861.html

---------------------------------------------------------------------------------------------------------------------------------------------

libcurl使用

http://blog.csdn.net/JGood/article/details/4787670

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html

相關推薦

Ubuntu+NDK編譯支援HTTPS的libcurl

參考文章: 1.NDK環境配置 http://blog.csdn.net/smfwuxiao/article/details/6587709 2.libcurl的配置修改 http://piggyq.com/pen/compile-libcurl-and-openssl-

NDK編譯支援C++11

APP_CPPFLAGS += -std=c++11 // APP_CPPFLAGS += -std=gnu++11 NDK_TOOLCHAIN_VERSION=4.8 APP_STL=gnustl_

ffmpeg2.6.2在Ubuntu下使用NDK編譯成.so檔案

參考blog:http://www.cnblogs.com/wainiwann/p/3785485.html 由於需要做視訊播放器,編解碼部分需要用到ffmpeg,沒辦法只能編譯ffmpeg.so 接下來就是參考網上多個ffmpeg的編譯過程,在多次嘗試後終於編譯成功,記

NDK編譯——x86 支援

NDK 引入對 x86 ABI 的支援,其允許原生程式碼在 CPU 可支援 IA-32 指令集的 Android 裝置上執行。 概覽 如需生成 x86 機器程式碼,請將 x86 新增到 Application.mk 檔案中的 APP_ABI 定義。 例如: APP_ABI := armeabi arme

ubuntu下gsoap支援openssl的編譯及簡單使用

問題: 我第一次下的是gsoap_2.8.69(當前最新版),但是折騰了許久還是沒安裝安裝成功,於是下了個gsoap_2.8.60,就成功了,果然是新版有風險!! 參考文章 安裝過程 依賴庫的安裝 主要安裝過程中主要是各依賴庫需要一一安裝

Ubuntu下用NDK編譯移植FFmpeg 2.0(配置最新版x264)到Android平臺

將x264配置到ffmpeg中需要先編譯x264,生成靜態庫或動態庫。因為264的靜態庫本身不大(我編譯完成後是1.1M)且考慮到平臺移植問題,這裡選擇的是編譯生成靜態庫。 準備,新建工作空間 (1)建立總目錄FFmpeg-Android eg: mkdir workspace --> cd wor

ffmpeg的ubuntu編譯過程(編譯靜態庫和動態庫)

ffmpeg第一步源碼下載通過git下載git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg或者直接下載wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.bz2如果是下載的ffmpeg-3.3.tar.bz2 需要進

[Ubuntu/Deepin_15] 編譯安裝 PHP 依賴庫

1.0 libmcrypt php擴展 highlight essential apt openssl client conf 編譯環境 sudo apt-get -y install build-essential xml sudo apt-get -y insta

NDK編譯庫執行時報dlopen failed: cannot locate symbol &quot;__exidx_end&quot; 解決的方法

and col 執行 data- pop cannot mod flags fuse 當用NDK編譯的庫在執行載入時報例如以下錯: dlopen("/data/data/xxx.xxx.xxx/lib/libxxx.so") failed: dlopen failed

android ndk 編譯的時候指令集的選取

文章 span tag androi ndk 有時 oca class word android ndk在編譯的時候默認生成的是thumb指令(拇指)不是arm(手臂)指令,但是有時候在看反匯編的時候,不太熟悉thumb指令或者說thumb指令看起來更費勁,需要生成arm指

使用NDK編譯mono

g++ 變量 tracking 定義 gin 安裝 threads linux idea 1.下載並安裝ndk 2.導出NDK文件夾到環境變量 export NDK=/var/data/android-ndk-r10e 3.執行NDK的工具鏈 $NDK/buil

Ubuntu安裝編譯OpenCV一鍵腳本(帶ffmpeg)

amd64 unix rep conf python 執行 pre -s spa 1.切換到用戶文件夾cd ~2.新建一個文件。命名為opencv.sh 腳本例如以下:version="$(wget -q -O - http://sourceforge.net

NDK編譯可執行文件在Android 中運行顯示error: only position independent executables (PIE) are supported.失敗問題解決辦法。

Language target 安全 問題 可執行 port ace 知識 基於 由於使用了NDK編譯的可執行文件在應用中調用,在Android 7.0上的運行情況發現,當運行該可執行文件時,報如下錯誤: error: only position independent e

NDk編譯opencv for Android,並引用在Unity3d遊戲中的一般步驟

ret app sset cpp unity3d 環境 ptr small var 本文使用:Unity3d + opencv + Android Unity3d中可以調用opencv 編譯好的.so 動態庫,在生成Android apk時可以正常運行。 因為An

ubuntu 17 編譯BTCoin

tar autot req wall pda sse .gz pre -a 一. 安裝開發環境 sudo apt-get update sudo apt-get install build-essential libtool autotools-dev autoco

Ubuntu系統編譯安裝ffmpeg

ubun acc profile pro -a toc nth export com FFmpeg編譯安裝(參數可以自定):./configure --enable-libmp3lame --enable-libfdk-aac --enable-libx264 --enab

ubuntu編譯 wpa_supplicant-2.6

wifi wlan 1.1 libnl-3.4.0./configure --prefix=/home/fnie/wpa/out/libnl --disable-static makemake checkmake install// to install the API documentation:m

ubuntu編譯ffmpeg+SDL+ffplay提取motion vector

ubunt cut object device .org 最新 編譯運行 sam draw 編譯ffmpeg: 第一步: 從官網http://ffmpeg.org/下載最新版本. 解壓tar -xjvf ffmpeg-3.3.1.tar.bz2 進入目錄cd ffmpeg

ubuntu編譯小知識點

enabled with ubun set 改變 led 特性 enable The 1 #改變編譯器選項 2 SET(CMAKE_C_COMPILER"g++") 3 #出現如下錯誤:添加C++11特性 4 #error: #error This file requir

解決一個Ubuntu編譯NEON優化的OpenCV的錯誤

asm pre neon iat tar 查詢 avg mpi 安裝 在Ubuntu 16中編譯開啟NEON優化的Opencv時,遇到libpng編譯是使用匯編代碼的錯誤,完整錯誤見文章末尾。通過查詢發現解決方案是安裝跨平臺編譯器,安裝代碼如下: sudo apt-get