[C/C++] -- Libcurl开发
libcurl 是一个功能强大的 C 语言库,用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心,并提供了一个简单、灵活、高效的 API,允许开发人员在他们的应用程序中轻松地执行网络操作。
以下是 libcurl 的一些主要特点和功能:
-
支持多种协议:libcurl 支持 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、LDAP、Telnet、SMTP、POP3、IMAP、RTSP 等多种网络传输协议,使开发人员能够处理各种网络通信需求。
-
跨平台性:libcurl 在多个操作系统上都可用,包括 Linux、macOS、Windows、BSD 等,使得开发人员能够在不同的平台上构建具有相同功能的网络应用程序。
-
易于使用的 API:libcurl 提供了简单且易于理解的 API,使开发人员能够轻松地集成网络功能到他们的应用程序中。API 提供了许多选项和回调函数,以满足各种需求,并支持异步和同步操作。
-
丰富的功能:除了基本的网络传输功能外,libcurl 还支持诸如 HTTPS、代理、身份验证、Cookie、断点续传、连接池、DNS 缓存、多线程安全等高级功能。
-
性能优化:libcurl 在设计上注重性能和效率,采用了一系列优化措施,包括连接重用、多路复用等技术,以确保网络传输的高效性。
-
开源和活跃的社区:libcurl 是一个开源项目,拥有庞大而活跃的社区支持。开发人员可以通过社区文档、邮件列表、论坛等途径获取支持和帮助,并参与到项目的开发和改进中。
1.Linux部署
从 curl 官网 下载最新版的源代码。
# libcurl 的部署和使用说明## 在 Linux 上部署 libcurl### 1. 安装依赖在大多数 Linux 发行版中,你可以通过包管理器来安装 libcurl 的依赖:```bash
sudo apt-get update
sudo apt-get install build-essential libtool autoconf unzip wget
编译安装
./buildconf
./configure
make
sudo make install
2.Android上部署libcurl
在Android上部署libcurl.a
1.移动至JNI目录
将对应平台的 libcurl.a 放在JNI文件夹中。
还有curl/整个文件夹(.h头文件) 也放在JNI路径
2.编译
将jni生成的so文件 一起联通libcurl.a一起编译
需要修改Android.mk文件
LOCAL_PATH := $(call my-dir)
LOCAL_PATH
是一个变量,$(call my-dir)
是一个函数调用,它返回当前Makefile所在的目录路径。这用于确保接下来的路径定义是相对于当前目录的。
include $(CLEAR_VARS)
$(CLEAR_VARS)
是一个预定义的变量,包含一个Makefile脚本,用于清除大多数预定义的LOCAL_XXX变量。这是为了避免变量在多个模块之间互相污染。
libcurl.a
LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
- 这部分定义了一个预构建的静态库模块。
LOCAL_MODULE
定义了模块的名称,这里是libcurl
。LOCAL_SRC_FILES
指定了静态库文件的路径,这里是libcurl.a
。$(PREBUILT_STATIC_LIBRARY)
包含一个Makefile脚本,用于处理预构建的静态库。
include $(CLEAR_VARS)
- 再次清除变量,为下一个模块做准备。
#libtestjni.so
LOCAL_MODULE := testjni
LOCAL_SRC_FILES := test.cpp login.cpp cJSON.cpp
LOCAL_LDLIBS := -llog
LOCAL_STATIC_LIBRARIES := libcurl
include $(BUILD_SHARED_LIBRARY)
- 这部分定义了一个共享库模块。
LOCAL_MODULE
定义了模块的名称,这里是testjni
。LOCAL_SRC_FILES
列出了模块的源文件,这里包括test.cpp
、login.cpp
和cJSON.cpp
。LOCAL_LDLIBS
指定了链接时需要的库,这里是-llog
(Android的日志库)。LOCAL_STATIC_LIBRARIES
指定了这个模块依赖的静态库,这里是前面定义的libcurl
。$(BUILD_SHARED_LIBRARY)
包含一个Makefile脚本,用于构建共享库。
-
库的复用:
- 静态库(如
libcurl.a
)在编译时被直接打包到最终的二进制文件中。这意味着所有使用该静态库的二进制文件都有一份该库的副本。 - 共享库(如
testjni.so
)在运行时加载,可以被多个应用程序或多个部分共享。这样可以节省内存和磁盘空间,因为只有一份共享库被加载和使用。
- 静态库(如
-
构建和部署策略:
libcurl
是一个通用的、预构建的库,可能在很多项目中复用。把它作为静态库来管理可以避免在每次编译时重复构建,节省时间,并确保库的稳定版本。testjni
是一个应用程序特定的库,可能包含了特定的业务逻辑和应用程序代码。把它作为共享库,可以让应用程序在运行时灵活地加载和更新这部分代码。
-
依赖关系管理:
- 通过将
libcurl
作为静态库,开发人员可以确保该库的所有依赖和代码都包含在最终的共享库testjni.so
中,这减少了运行时的依赖问题。 - 共享库
testjni
则可以依赖于多个静态库,将不同功能模块化,提高了代码的可维护性和模块化程度。
- 通过将
-
性能考虑:
- 静态库会在编译时被打包到目标二进制文件中,运行时不需要额外的加载时间,启动速度可能会更快。
- 共享库在初次加载时需要一些时间,但可以在多个应用程序间共享,减少整体的内存占用。
3 .修改AndroidStudio配置文件
项目/app/build.gradle
在defaultConfig {}
// 不声明ndk标签,项目默认会创建一个libapp.so的文件
ndk {
// 声明创建so库的文件名,会自动添加lib前缀, 添加了前缀,不会自动添加
moduleName "testjni"
//声明启用Android日志, 在c/c++的源文件中使用的#include <android/log.h> 日志将得到输出
//这里我们关联了两个库 一个是liblog 和 libz
ldLibs "log","z"
// 声明创建指定cpu架构的so库, 不声明的话, 默认(gradle 1.5.0)会生成7中架构,如果你的libcurl没有提供别的平台,那么就会链接失败,
//所以此条配置很重要,这里我们只生成一个平台
abiFilters "armeabi-v7a"
}
4 .添加makefile
在JNI路径下 添加Application.mk文件
在文件中添加如下代码 表示当前ndk_build 过滤平台结果
APP_ABI = armeabi已过时
APP_ABI := armeabi-v7a
5 .在login.cpp中添加
#include "curl/curl.h"
在login的jni接口中
随便调用curl代码
CURL* curl = curl_easy_init();
点击SYnc Now
6.编译
ndk_build.cmd 重新生成so文件 看是否能够编译成功
7.部署
部署在app手机上,点击一下登陆按钮。如果app不崩溃 环境通了。
3.Curl指令的常用方法
Curl 是一个利用 URL 语法在命令行下工作的文件传输工具。它支持多种协议,包括 HTTP、HTTPS、FTP 等。
常用命令
- 下载文件
curl -O [URL]
- 发送 POST 请求
curl -d "param1=value1¶m2=value2" -X POST [URL]
- 发送带有头部信息的请求
curl -H "Content-Type: application/json" -X POST -d '{"key1":"value1", "key2":"value2"}' [URL]
- 保存下载的文件
curl -o filename.html [URL]
相关文章:
[C/C++] -- Libcurl开发
libcurl 是一个功能强大的 C 语言库,用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心,并提供了一个简单、灵活、高效的 API,允许开发人员在他们的应用程序中轻松地执行网络操作。 以下是 libcurl 的一些主要特点和功能…...

Streamsets-JDBC模式使用更新时间字段数据同步
StreamSets的开源地址:https://github.com/streamsets/datacollector-oss Streamsets官网地址:https://streamsets.com/ Streamsets文档地址:https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…...

Nodejs-- 网络编程
网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议,在传输之前需要形成三次握手形成会话 只有会话形成了,服务端和客户端才能想发送数据,在创建会话的过程中,服务端和客户…...
React@16.x(14)context 举例 - Form 表单
目录 1,目标2,实现2.1,index.js2.2,context.js2.2,Form.Input2.3,Form.Button 3,使用 1,目标 上篇文章说到,context 上下文一般用于第3方组件库,因为使用场景…...
十几款基于ChatGPT的免费神器,每个都是王炸!
十几款基于ChatGPT的免费神器,每个都是王炸! 1、ChatGPT ChatGPT非常强大,但注册需要魔法和国外的手机号,大部分人都没法使用。还好有一些基于API开发的体验版,我收集了一些可以直接使用的站点分享给大家,…...

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容
问题:devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效,没有输出内容 原因: 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 ,进行权限申请 源码: <!DOCTYPE h…...
java单元测试如何断言异常
在junit单元测试中,我们可以使用 org.junit.Assert.assertThrows 包下的 assertThrows() 方法 这个方法返回了一个泛型的异常 public static <T extends Throwable> assertThrows(Class<T> expectedType, Executable executable) 假设我们有以下…...
C语言| n的阶乘相加
逻辑性较强,建议记住。 分析思路: 假如n4:m m * i; sum sum m; 1)当i1时,m1, sum1。 2)当i2时,m12, sum112。 3)当i3时,m123, sum112123。 4)当i4时&…...
cwiseMax、cwiseMin函数
一、cwiseMax含义 cwiseMax是Eigen库中的一个函数,用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数,但是可以同时处理多个元素,且支持矩阵和向量。 举例: 例如,对于两个向量a和b,cwiseMax…...

【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php
在Apache运行thinkphp5.1时,发现系统默认生成的.htaccess不生效。 首先先查看怎么修改伪静态 1、修改Apache的配置文件 在Apache的安装目录下,打开config/httpd.conf。 搜索rewrite.so,将前面的#删掉,表示开启URL重写功能 2、…...
缓冲字符流
BufferedReader/BufferedWriter增加了缓存机制,大大提高了读写文本文件的效率。 字符输入缓冲流 BufferedReader是针对字符输入流的缓冲流对象,提供了更方便的按行读取的方法:readLine();在使用字符流读取文本文件时,我们可以使…...

Django中使用Celery和APScheduler实现定时任务
在之前的文章我们已经学习了Celery和APScheduler的基本使用,下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3(…...
Kivy.uix.textinput
一个小小的输入框,纵上下数页文档已不能全不概括,当去源码慢慢寻找,才知道其中作用,才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…...

基于IoTDB 平台的学习和研究
Apache IoTDB(物联网数据库)是一个针对物联网领域的高性能原生数据库,适用于数据管理和分析,并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集,以及与Apache Hadoop、Spark和Flink的深度集成&…...
nessus plugins目录为空的问题
想要避免这种问题,可以将nessus服务设置为手动,并且先停止nessus服务。 批处理脚本: 下面的/~/Nessus/plugin_feed_info.inc替换成你配置好的 plugin_feed_info.inc 所在的路径 service nessusd stop; cp /~/Nessus/plugin_feed_info.inc …...

FDW(Foreign Data Wrapper)
在上一篇博客里,最末尾提到了 FDW。pg 实现了数百个 fdw 插件,用于访问外部数据。 FDW 到底是什么呢? 标准 FDW(Foreign Data Wrapper)遵循了 SQL/MED 标准,标准全称:ISO/IEC 9075-9 Managem…...
Flutter开发指南
Flutter开发指南(Android 开发角度) 与Android 的对比 1.Android 的View 与Flutter 的对应关系: a.在android 中,view 是屏幕显示的基础,比如 button,文本,列表,输入框都是 view。…...

SpringCloud学习笔记万字整理(无广版在博客)
在此感谢黑马程序员的SpringCloud课程 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验(无广告且清爽),请访问本篇笔记 认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐…...

c++(七)
c(七) 内联函数内联函数的特点为什么要有内联函数内联函数是如何工作的呢 类型转换异常处理智能指针单例模式懒汉模式饿汉模式 VS中数据库的相关配置 内联函数 修饰类的成员函数,关键字:inline inline 返回值类型 函数名(参数列…...

SQL语言
SQL语言 导航 文章目录 SQL语言导航一、SQL概述SQL 二、数据库定义SQL 数据类型 三、数据操作视图更新 四、SQL的授权五、存储过程六、嵌入式SQL主语言与数据库通信 七、动态SQL 一、SQL概述 SQL 支持三级模式结构 视图->外模式 基本表->模式 存储文件->内模式 二…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...