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;
}

六、编译

七、运行

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

相关推荐
Dovis(誓平步青云)几秒前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄3 分钟前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.1 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦1 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠2 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
starzy19903 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
zhanghaha13144 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain4 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕4 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
zhanghaha13144 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#