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

Kotlin Native调用C curl

官方中文文档

https://kotlin.liying-cn.net/native-app-with-c-and-libcurl.html

实验环境:macOS - IDEA

一、安装 libcurl

brew install curl

配置环境变量:

echo 'export LDFLAGS="-L/usr/local/opt/curl/lib"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/usr/local/opt/curl/include"' >> ~/.zshrc

使配置生效:

source ~/.zshrc

二、克隆仓库

git clone https://github.com/Kotlin/kmp-native-wizard

三、新建 libcurl.def 文件

1. 在 src 文件夹下,选择 File | New | Directory 创建新目录。

2. 将新目录命名为 nativeInterop/cinterop,这是 libcurl 头文件的默认位置。如果你选择了不同的位置,也可以在 build.gradle.kts 文件中做相应修改。

3. 进入新建的子文件夹,使用 File | New | File 创建一个名为 libcurl.def 的文件,并将其内容更新为以下代码:

headers = curl/curl.h
headerFilter = curl/*compilerOpts.linux = -I/usr/include -I/usr/include/x86_64-linux-gnu
linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/curl/lib -lcurl
linkerOpts.linux = -L/usr/lib/x86_64-linux-gnu -lcurl

四、修改 build.gradle.kts 文件

plugins {alias(libs.plugins.kotlinMultiplatform)alias(libs.plugins.kotlinxSerialization)
}group = "me.user"
version = "1.0-SNAPSHOT"repositories {mavenCentral()
}kotlin {val hostOs = System.getProperty("os.name")val isArm64 = System.getProperty("os.arch") == "aarch64"val isMingwX64 = hostOs.startsWith("Windows")val nativeTarget = when {hostOs == "Mac OS X" && isArm64 -> macosArm64("native")hostOs == "Mac OS X" && !isArm64 -> macosX64("native")hostOs == "Linux" && isArm64 -> linuxArm64("native")hostOs == "Linux" && !isArm64 -> linuxX64("native")isMingwX64 -> mingwX64("native")else -> throw GradleException("Host OS is not supported in Kotlin/Native.")}nativeTarget.apply {compilations.getByName("main") {cinterops {val libcurl by creating {definitionFile.set(project.file("src/nativeInterop/cinterop/libcurl.def"))packageName("libcurl")compilerOpts("-I/usr/local/opt/curl/include")  // 设置头文件路径includeDirs.allHeaders("/usr/local/opt/curl/include")  // 包含头文件目录linkerOpts("-L/usr/local/opt/curl/lib")  // 设置库文件路径}}}binaries {executable {entryPoint = "main"}}}sourceSets {nativeMain.dependencies {implementation(libs.kotlinxSerializationJson)}}
}

五、用 IDEA 打开这个项目的 main.kt 修改内容为

import kotlinx.cinterop.*
import libcurl.*@OptIn(ExperimentalForeignApi::class)
fun main(args: Array) {val curl = curl_easy_init()if (curl != null) {curl_easy_setopt(curl, CURLOPT_URL, "https://www.anyuer.club")curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L)val res = curl_easy_perform(curl)if (res != CURLE_OK) {println("curl_easy_perform() failed ${curl_easy_strerror(res)?.toKString()}")}curl_easy_cleanup(curl)}
}

这段代码等价于用 C 语言编写的代码,原理是通过调用 curl 库:

#include <stdio.h>
#include <curl/curl.h>int main(void)
{CURL *curl;CURLcode res;curl = curl_easy_init();if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "https://www.anyuer.club");curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);res = curl_easy_perform(curl);if(res != CURLE_OK)fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));curl_easy_cleanup(curl);}return 0;
}

六、编译

编译截图

七、运行

编译没有问题后,点击运行:

运行截图

http://www.dtcms.com/a/318689.html

相关文章:

  • 内部类详解:Java中的嵌套艺术
  • WebView 中控制光标
  • Diamond基础1:认识Lattice器件
  • 数据结构 二叉树(1)二叉树简单了解
  • Linux学习-数据结构(栈和队列)
  • 8.6学习总结
  • Selenium在Pyhton应用
  • Java 大视界 -- Java 大数据机器学习模型在电商用户生命周期价值评估与客户关系精细化管理中的应用(383)
  • 应急响应排查(windows版)
  • Vue计算属性详解2
  • Python Pandas.lreshape函数解析与实战教程
  • 机器学习模型调优实战指南
  • 关于应急响应的那些事
  • 第14届蓝桥杯Scratch选拔赛初级及中级(STEMA)真题2023年3月12日
  • 人工智能-python-机器学习实战:特征降维、PCA与KNN的核心价值解析
  • Linux: NFS 服务部署与autofs自动挂载的配置
  • 分隔串处理方法
  • SQL注入SQLi-LABS 靶场less51-57详细通关攻略
  • 【2026版】JVM面试题
  • K8S的POD数量限制
  • 敏捷协作平台推荐:Jira、PingCode、Tapd等15款
  • C++ - 仿 RabbitMQ 实现消息队列--网络通信协议设计
  • 力扣-42.接雨水
  • 云平台托管集群:EKS、GKE、AKS 深度解析与选型指南-第二章
  • java 桌面应用程序基本框架
  • 【算法训练营Day21】回溯算法part3
  • C语言:指针(1-2)
  • 亚马逊新品实现快速起量:如何设置有效的广告竞价策略
  • Java保姆级新手教程第三章(方法与数组)
  • 亚马逊广告进阶指南:广告转化的基本原理