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

2024-06-01 22:36
文章标签 c++ 开发 libcurl

本文主要是介绍[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开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022287

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名