c++开发之编译curl(安卓版本)
为了在 Android 上编译支持 OpenSSL
的 libcurl
,你需要手动编译 libcurl
和 OpenSSL
,并确保它们能够在 Android 的交叉编译环境中正常工作。以下是详细的步骤说明。
1. 安装必要工具
在编译之前,确保你已经安装了以下工具:
- Android NDK
- CMake
- Ninja 或 Make(编译工具)
你可以通过 Android 官方文档下载 Android NDK 并安装。
2. 下载 libcurl
和 OpenSSL
源代码
首先下载 libcurl
和 OpenSSL
的源码:
- libcurl
- OpenSSL
你可以通过 wget
或 git
获取它们。
# 下载 OpenSSL 源代码
wget https://www.openssl.org/source/openssl-1.1.1-latest.tar.gz
tar -xzf openssl-1.1.1-latest.tar.gz
cd openssl-1.1.1*# 下载 libcurl 源代码
wget https://curl.se/download/curl-7.79.1.tar.gz
tar -xzf curl-7.79.1.tar.gz
cd curl-7.79.1
3. 编译 OpenSSL for Android
首先,我们需要使用 Android NDK 来编译 OpenSSL
,这个过程需要交叉编译工具链。假设你已经下载并配置好了 Android NDK。
export ANDROID_NDK_HOME=/path/to/android-ndk# 设置交叉编译环境
export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
export API=21 # 这里的API可以根据你支持的最低版本调整# 设置编译架构,举例为arm64-v8a
export ARCH=arm64
export TARGET_HOST=aarch64-linux-android
export SYSROOT=$TOOLCHAIN/sysroot# 配置交叉编译参数
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/$TARGET_HOST$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET_HOST$API-clang++# 开始编译 OpenSSL
./Configure android-arm64 no-shared --prefix=$PWD/openssl_build --openssldir=$PWD/openssl_build# 编译并安装
make -j4
make install
在此过程中,OpenSSL
将被编译并安装到指定的 openssl_build
目录中。
4. 编译 libcurl with OpenSSL for Android
接下来,我们编译 libcurl
,并指定使用我们编译的 OpenSSL
。
首先确保你设置了 CMake
并配置好 Android NDK 编译工具链。
cd /path/to/curl-7.79.1# 创建编译目录
mkdir build && cd build# 设置编译参数并指向 OpenSSL
cmake .. \-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \-DANDROID_ABI=arm64-v8a \-DANDROID_PLATFORM=android-21 \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_USE_OPENSSL=ON \-DOPENSSL_ROOT_DIR=/path/to/openssl_build \-DOPENSSL_INCLUDE_DIR=/path/to/openssl_build/include \-DOPENSSL_LIBRARIES=/path/to/openssl_build/lib/libssl.a \-DCURL_STATICLIB=ON# 开始编译
make -j4
5. 编译选项说明
CMAKE_TOOLCHAIN_FILE
: 指定 Android 的 CMake 工具链。ANDROID_ABI
: 指定要编译的 ABI 架构,比如arm64-v8a
。ANDROID_PLATFORM
: 指定目标 Android 平台,比如android-21
。CMAKE_USE_OPENSSL
: 启用OpenSSL
支持。OPENSSL_ROOT_DIR
: 指定OpenSSL
的编译输出目录。OPENSSL_INCLUDE_DIR
: 指定OpenSSL
头文件目录。OPENSSL_LIBRARIES
: 指定OpenSSL
静态库的路径。
6. 验证编译
在编译完成后,生成的 libcurl
静态库和相关头文件会位于 build
目录下。可以将它们整合到 Android 项目中,或创建一个新的 NDK 模块。
你可以在 Android 项目中通过 JNI 调用编译生成的 libcurl
静态库来实现 HTTP 请求。
7. 可能遇到的问题
-
OpenSSL 交叉编译失败:确保正确配置了 Android NDK 工具链,并且
CC
和CXX
指向正确的编译器。如果编译器路径不正确,可能会导致链接错误。 -
链接错误:编译
libcurl
时,如果OpenSSL
路径没有设置正确,可能会出现链接错误。确保OPENSSL_INCLUDE_DIR
和OPENSSL_LIBRARIES
都设置正确。 -
API 版本:确保 Android API 版本与设备兼容。如果设置的 API 版本过高,可能导致无法在较旧的设备上运行。
8. 在 Android 项目中使用
编译完成后,生成的库可以通过 ndk-build
或者 CMake
集成到 Android 项目中。确保 Android.mk
或 CMakeLists.txt
文件正确包含编译生成的 .so
或静态库文件。
例如,在 CMakeLists.txt
中:
add_library(curl SHARED IMPORTED)
set_target_properties(curl PROPERTIES IMPORTED_LOCATION /path/to/libcurl.a)target_link_libraries(your_android_projectcurlsslcrypto
)
通过 Android NDK 交叉编译 OpenSSL
和 libcurl
可以实现 Android 平台上使用 libcurl
的功能,并且支持 HTTPS 请求。关键在于正确配置 NDK 工具链,并确保 OpenSSL
库能够正确编译并与 libcurl
链接。
相关文章:
c++开发之编译curl(安卓版本)
为了在 Android 上编译支持 OpenSSL 的 libcurl,你需要手动编译 libcurl 和 OpenSSL,并确保它们能够在 Android 的交叉编译环境中正常工作。以下是详细的步骤说明。 1. 安装必要工具 在编译之前,确保你已经安装了以下工具: And…...

QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析
一、阿里云环境配置 大家在编写QT连接阿里云的程序之前,先按照下面这篇文章让消息可以在阿里云上顺利流转 QTESP8266STM32项目构建三部曲二--阿里云云端处理之云产品流转-CSDN博客文章浏览阅读485次,点赞7次,收藏4次。创建两个设备ÿ…...
Web APIs 5:Window对象(BOM)+本地存储
Web APIs 5(BOM:Window对象本地存储) 1.BOM(浏览器对象模型)(后面几个对象都为BOM对象) BOM对象包含:navigator、location、document(DOM对象)、history、screenBOM是一个全局对象,即JS中的顶…...

神经网络(四):UNet图像分割网络
文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 论文链接:点击跳转 一、简介 UNet网络是一种用于图像分割的卷积神经网络,其特点是采用了U型网络结构,因此称为UNet。该网络具有编码器和解码器结构&#…...
Java 编码系列:注解处理器详解与面试题解析
引言 在上一篇文章中,我们详细探讨了 Java 注解的基本概念、自定义注解、元注解等技术。本文将继续深入探讨 Java 注解处理器(Annotation Processor),介绍如何编写注解处理器,并结合大厂的最佳实践和面试题详细解析其…...

C语言 | Leetcode C语言题解之第441题排列硬币
题目: 题解: class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };...

Linux noVNC远程桌面(xfce)部署
一、安装 VNC 服务器和桌面环境 Notebook实验 常用vnc服务 VNC (Virtual Network Computing) 是一种远程桌面协议,可以让你通过网络访问服务器的图形界面。 TurboVNC:专为图形密集型应用设计,尤其适合 3D 可视化和高分辨率图像的远程传输…...
【网络安全】身份认证
1. 身份认证 1.1 定义 身份认证(Authentication)是确认用户身份的过程,确保只有授权的用户才能访问系统或资源。它通常涉及验证用户提供的凭证,如密码、生物特征或其他识别标志。 1.2 重要性 身份认证是信息安全的第一道防线&…...

LeetCode - #124 二叉树中的最大路径和(Top 100)
文章目录 前言1. 描述2. 示例3. 答案关于我们前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新到 123 期…...

Java:插入排序
目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个…...

How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024)概览
关注B站可以观看更多实战教学视频:hallo128的个人空间 How FAR ARE WE FROM AGI?官网 How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024) 该研讨会将于2024年5月11日在奥地利维也纳以混合模式举行,作为 ICLR 2024年会议的一部…...
leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.不同的二叉搜索树)
62.不同路径 机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。 动规五部曲 1、确定dp数组(dp table)以及下标的含义 dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路…...

基于Python大数据的B站热门视频的数据分析及可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
matlab-批处理图像质量变化并形成折线图 (PSNR)
%修改路径就能用,图片分辨率要一致 %clc;clear all;close all;tic;%清理内存 file_pathE:\test\resources\image\;% 批量图像所在的文件夹下 file_save_pathE:\test\resources\SaveImage\;% 要存储的地址 img_path_listdir(strcat(file_path,*.jpg));% 获取批量bm…...
[Doc][Ros2]ros2中Qos(Quality of Service,服务质量)介绍
在 ROS 2 中,QoS(Quality of Service,服务质量)是用于控制节点之间消息传递的可靠性、历史存储和数据持久性等方面的机制。通过 QoS 设置,用户可以更细粒度地控制消息传递的行为,确保在不同网络环境或应用场景中满足特定的通信需求。 几个常用的包: QoSProfile: 含义…...

SpringBoot日志集成-LogBack
Log4J:最早的Java日志框架之一,由Apache基金会发起,提供灵活而强大的日志记录机制JDK自带的日志框架:java.util.logging.Logg,是JDK1.4之后提供的日志API,已淘汰logback: logback一个开源的日志…...

Google BigTable架构详解
文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统,用于管理大规模…...

【python】如何切换ipynb的kernel至指定conda环境
需求介绍 打开(若无新建环境) 环境 conda env list conda activate cvml conda install ipykernel python -m ipykernel install --name cvml 以上完成后,打开jupyter 创建一个python文件 在kernel——>change kernel——>python[conda env:cvml] 参考资料…...
Linux【基础指令汇总】
目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…...
SpringCloud-EurekaClient
创建Module pom.xml <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> spring:application:name: provider # 应用程序的名称,…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...