当前位置: 首页 > news >正文

[C/C++] -- Libcurl开发

libcurl 是一个功能强大的 C 语言库,用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心,并提供了一个简单、灵活、高效的 API,允许开发人员在他们的应用程序中轻松地执行网络操作。

以下是 libcurl 的一些主要特点和功能:

  1. 支持多种协议:libcurl 支持 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、LDAP、Telnet、SMTP、POP3、IMAP、RTSP 等多种网络传输协议,使开发人员能够处理各种网络通信需求。

  2. 跨平台性:libcurl 在多个操作系统上都可用,包括 Linux、macOS、Windows、BSD 等,使得开发人员能够在不同的平台上构建具有相同功能的网络应用程序。

  3. 易于使用的 API:libcurl 提供了简单且易于理解的 API,使开发人员能够轻松地集成网络功能到他们的应用程序中。API 提供了许多选项和回调函数,以满足各种需求,并支持异步和同步操作。

  4. 丰富的功能:除了基本的网络传输功能外,libcurl 还支持诸如 HTTPS、代理、身份验证、Cookie、断点续传、连接池、DNS 缓存、多线程安全等高级功能。

  5. 性能优化:libcurl 在设计上注重性能和效率,采用了一系列优化措施,包括连接重用、多路复用等技术,以确保网络传输的高效性。

  6. 开源和活跃的社区: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.cpplogin.cppcJSON.cpp
    • LOCAL_LDLIBS 指定了链接时需要的库,这里是-llog(Android的日志库)。
    • LOCAL_STATIC_LIBRARIES 指定了这个模块依赖的静态库,这里是前面定义的libcurl
    • $(BUILD_SHARED_LIBRARY) 包含一个Makefile脚本,用于构建共享库。
  1. 库的复用

    • 静态库(如libcurl.a)在编译时被直接打包到最终的二进制文件中。这意味着所有使用该静态库的二进制文件都有一份该库的副本。
    • 共享库(如testjni.so)在运行时加载,可以被多个应用程序或多个部分共享。这样可以节省内存和磁盘空间,因为只有一份共享库被加载和使用。
  2. 构建和部署策略

    • libcurl是一个通用的、预构建的库,可能在很多项目中复用。把它作为静态库来管理可以避免在每次编译时重复构建,节省时间,并确保库的稳定版本。
    • testjni是一个应用程序特定的库,可能包含了特定的业务逻辑和应用程序代码。把它作为共享库,可以让应用程序在运行时灵活地加载和更新这部分代码。
  3. 依赖关系管理

    • 通过将libcurl作为静态库,开发人员可以确保该库的所有依赖和代码都包含在最终的共享库testjni.so中,这减少了运行时的依赖问题。
    • 共享库testjni则可以依赖于多个静态库,将不同功能模块化,提高了代码的可维护性和模块化程度。
  4. 性能考虑

    • 静态库会在编译时被打包到目标二进制文件中,运行时不需要额外的加载时间,启动速度可能会更快。
    • 共享库在初次加载时需要一些时间,但可以在多个应用程序间共享,减少整体的内存占用。

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&param2=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 语言库&#xff0c;用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心&#xff0c;并提供了一个简单、灵活、高效的 API&#xff0c;允许开发人员在他们的应用程序中轻松地执行网络操作。 以下是 libcurl 的一些主要特点和功能&#xf…...

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…...

Nodejs-- 网络编程

网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议&#xff0c;在传输之前需要形成三次握手形成会话 只有会话形成了&#xff0c;服务端和客户端才能想发送数据&#xff0c;在创建会话的过程中&#xff0c;服务端和客户…...

React@16.x(14)context 举例 - Form 表单

目录 1&#xff0c;目标2&#xff0c;实现2.1&#xff0c;index.js2.2&#xff0c;context.js2.2&#xff0c;Form.Input2.3&#xff0c;Form.Button 3&#xff0c;使用 1&#xff0c;目标 上篇文章说到&#xff0c;context 上下文一般用于第3方组件库&#xff0c;因为使用场景…...

十几款基于ChatGPT的免费神器,每个都是王炸!

十几款基于ChatGPT的免费神器&#xff0c;每个都是王炸&#xff01; 1、ChatGPT ChatGPT非常强大&#xff0c;但注册需要魔法和国外的手机号&#xff0c;大部分人都没法使用。还好有一些基于API开发的体验版&#xff0c;我收集了一些可以直接使用的站点分享给大家&#xff0c…...

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容

问题&#xff1a;devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效&#xff0c;没有输出内容 原因&#xff1a; 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 &#xff0c;进行权限申请 源码&#xff1a; <!DOCTYPE h…...

java单元测试如何断言异常

​ 在junit单元测试中&#xff0c;我们可以使用 org.junit.Assert.assertThrows 包下的 assertThrows() 方法 这个方法返回了一个泛型的异常 public static <T extends Throwable> assertThrows(Class<T> expectedType, Executable executable)​ 假设我们有以下…...

C语言| n的阶乘相加

逻辑性较强&#xff0c;建议记住。 分析思路&#xff1a; 假如n4&#xff1a;m m * i; sum sum m; 1&#xff09;当i1时&#xff0c;m1, sum1。 2&#xff09;当i2时&#xff0c;m12, sum112。 3&#xff09;当i3时&#xff0c;m123, sum112123。 4&#xff09;当i4时&…...

cwiseMax、cwiseMin函数

一、cwiseMax含义 cwiseMax是Eigen库中的一个函数&#xff0c;用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数&#xff0c;但是可以同时处理多个元素&#xff0c;且支持矩阵和向量。 举例&#xff1a; 例如&#xff0c;对于两个向量a和b&#xff0c;cwiseMax…...

【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php

在Apache运行thinkphp5.1时&#xff0c;发现系统默认生成的.htaccess不生效。 首先先查看怎么修改伪静态 1、修改Apache的配置文件 在Apache的安装目录下&#xff0c;打开config/httpd.conf。 搜索rewrite.so&#xff0c;将前面的#删掉&#xff0c;表示开启URL重写功能 2、…...

缓冲字符流

BufferedReader/BufferedWriter增加了缓存机制&#xff0c;大大提高了读写文本文件的效率。 字符输入缓冲流 BufferedReader是针对字符输入流的缓冲流对象&#xff0c;提供了更方便的按行读取的方法&#xff1a;readLine();在使用字符流读取文本文件时&#xff0c;我们可以使…...

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用&#xff0c;下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…...

Kivy.uix.textinput

一个小小的输入框&#xff0c;纵上下数页文档已不能全不概括&#xff0c;当去源码慢慢寻找&#xff0c;才知道其中作用&#xff0c;才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…...

基于IoTDB 平台的学习和研究

Apache IoTDB&#xff08;物联网数据库&#xff09;是一个针对物联网领域的高性能原生数据库&#xff0c;适用于数据管理和分析&#xff0c;并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集&#xff0c;以及与Apache Hadoop、Spark和Flink的深度集成&…...

nessus plugins目录为空的问题

想要避免这种问题&#xff0c;可以将nessus服务设置为手动&#xff0c;并且先停止nessus服务。 批处理脚本&#xff1a; 下面的/~/Nessus/plugin_feed_info.inc替换成你配置好的 plugin_feed_info.inc 所在的路径 service nessusd stop; cp /~/Nessus/plugin_feed_info.inc …...

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。pg 实现了数百个 fdw 插件&#xff0c;用于访问外部数据。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Managem…...

Flutter开发指南

Flutter开发指南&#xff08;Android 开发角度&#xff09; 与Android 的对比 1.Android 的View 与Flutter 的对应关系&#xff1a; a.在android 中&#xff0c;view 是屏幕显示的基础&#xff0c;比如 button&#xff0c;文本&#xff0c;列表&#xff0c;输入框都是 view。…...

SpringCloud学习笔记万字整理(无广版在博客)

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

c++(七)

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

SQL语言

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

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...