[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 支持三级模式结构 视图->外模式 基本表->模式 存储文件->内模式 二…...
nardeas/ssh-agent:增强版SSH代理工具的设计、部署与实战应用
1. 项目概述:一个被低估的SSH代理工具如果你和我一样,日常需要在多台服务器、开发机、跳板机之间穿梭,手里捏着十几把甚至几十把SSH密钥,那你一定对ssh-agent这个工具又爱又恨。爱的是,它确实能让你免去一遍遍输入密钥…...
NotebookLM生物技术研究落地难?92%实验室尚未启用的3个隐藏功能(内部白皮书首次公开)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM生物技术研究落地难?92%实验室尚未启用的3个隐藏功能(内部白皮书首次公开) NotebookLM 作为 Google 推出的实验性 AI 助手,其在生物技术领域的…...
哔哩下载姬完整指南:三步快速掌握B站视频批量下载技巧
哔哩下载姬完整指南:三步快速掌握B站视频批量下载技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#…...
终极指南:如何在Windows电脑上免费预览iPhone的HEIC照片
终极指南:如何在Windows电脑上免费预览iPhone的HEIC照片 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你是否经常遇…...
基于ARM9核心板的工业双CAN网关开发实战:从硬件选型到软件架构
1. 项目概述与核心价值最近在做一个工业网关项目,客户要求设备必须支持双路CAN总线,用于同时连接现场的执行器和上位机监控系统。时间紧,任务重,自己从头设计硬件、画板、调试驱动,周期太长,风险也高。这时…...
ChatGPT与Notion深度整合实战手册(企业级私有化部署版):支持API密钥分级管控、审计日志追踪、GDPR合规配置
更多请点击: https://codechina.net 第一章:ChatGPT与Notion深度整合概述 ChatGPT 与 Notion 的深度整合正重塑个人知识管理与团队协作的工作流范式。二者分别代表当前最强大的语言理解能力与最灵活的结构化信息组织平台,其结合并非简单 API…...
书成紫微动律定凤凰驯:抛开网络臆想歪论正视海棠山铁哥的大道凰标之道
——褪去网络流言,正视正统文脉网络世间众说纷纭,流言四起,诸多无根揣测、片面臆想肆意流传。 不少人未曾静心品读深意,仅凭只言片语便妄加评判,或是跟风曲解本意,或是刻意附会杂论,更有甚者凭空…...
AutoGen多角色协作内幕:如何在对话中实现复杂任务的自动分解
AutoGen多角色协作内幕:对话式复杂任务自动分解的底层原理与工程实现 关键词 AutoGen、多智能体协作、任务自动分解、大语言模型对话系统、多角色工作流、LLM编排、工具调用集成 摘要 本文从第一性原理出发,系统拆解微软AutoGen框架中多角色协作下的复杂任务自动分解机制…...
从零搭建到日常调试:一份给新手的 Kafka 命令行操作全流程指南
从零搭建到日常调试:一份给新手的 Kafka 命令行操作全流程指南 第一次接触 Kafka 时,我被它那些晦涩的概念和复杂的命令行参数搞得晕头转向。作为一个从 MySQL 和 Redis 这类传统数据库转过来的开发者,Kafka 的分布式消息队列模型确实需要一些…...
Arm DynamIQ架构缓存一致性协议解析与优化
1. Arm DynamIQ架构中的缓存一致性技术解析在异构计算架构中,缓存一致性协议是确保多核处理器高效协同工作的关键技术。作为Arm体系结构的重要组成部分,DynamIQ共享单元(DSU)通过AMBA ACE和CHI协议实现了灵活的系统级缓存一致性管理。这两种协议虽然设计…...
