如何在 Kotlin/Multiplatform 项目中使用 .klib 库

Posted

技术标签:

【中文标题】如何在 Kotlin/Multiplatform 项目中使用 .klib 库【英文标题】:How to use .klib library in Kotlin/Multiplatform project 【发布时间】:2021-02-01 05:40:19 【问题描述】:

我想在我的 Kotlin/Multiplatform 项目(通用级别)中使用 C 代码。 通过这篇文章: https://theprogrammershangout.com/resources/kotlin/native/creating-c-bindings.md/ 我得到了我的 .klib 文件,现在我想将它添加到我的 IntelliJ Kotlin/Multiplatform 项目中。 我正在尝试将其添加到 Gradle 中但没有成功:

implementation files("/path/to/App.klib")

项目构建成功,但导入的App没有解析。 我错过了什么?

我已经在整个互联网上进行了搜索,但没有发现任何有用的信息。

我的 build.gradle:

buildscript 
    repositories 
        google()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:3.4.1'
    


plugins 
    id 'org.jetbrains.kotlin.multiplatform' version '1.4.10'
    id 'maven-publish'


apply plugin: 'com.android.library'

repositories 
    mavenCentral()
    google()
    jcenter()


group 'com.texel.examples.kotlinnative'
version '0.0.1'

android 
    compileSdkVersion 28
    defaultConfig 
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName '1.0'
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    
    buildTypes 
        release 
            minifyEnabled false
        
    
    sourceSets 
        main 
            manifest.srcFile 'src/jvmMain/AndroidManifest.xml'
            java.srcDirs = ['src/jvmMain/kotlin']
            res.srcDirs = ['src/jvmMain/resources']
        
    


dependencies 
    androidTestImplementation 'com.android.support.test:runner:1.0.2'



kotlin 
    // This is for iPhone emulator
    // Switch here to iosArm64 (or iosArm32) to build library for iPhone device
//    iosX64("ios") 
//        binaries 
//            framework()
//        
//    

    macosX64("maccos") 
        binaries 
            framework()
        
    

    android("android") 
        // you can also publish both "release" and "debug"
        publishLibraryVariants("release")
    


    sourceSets 
        commonMain 
            dependencies 
                implementation 'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10'
                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9-native-mt"
                implementation files("/Users/user/Downloads/App.klib")
            
        
        jvmMain 
            dependencies 
                implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
            
        
        jsMain 
            dependencies 
                implementation 'org.jetbrains.kotlin:kotlin-stdlib-js'
            
        
        macosMain 
            dependencies 
            
        
        iosMain 
            dependencies 
            
        
    



configurations 
    compileClasspath

非常感谢。

【问题讨论】:

嗨,Matan,你有解决上述问题的方法吗?我面临同样的问题。请告诉我你的解决方案 【参考方案1】:

这是官方文档:C Interop 和 Using C Interop and libcurl for an App (您可能更喜欢查看 https://github.com/JetBrains/kotlin-native/tree/master/samples/libcurl)

正如我所见,gradle 设置完全不同:

   hostTarget.apply 
    compilations["main"].cinterops 
        val libcurl by creating 
            when (preset) 
                presets["macosX64"] -> includeDirs.headerFilterOnly("/opt/local/include", "/usr/local/include")
                presets["linuxX64"] -> includeDirs.headerFilterOnly("/usr/include", "/usr/include/x86_64-linux-gnu")
                presets["mingwX64"] -> includeDirs.headerFilterOnly(mingwPath.resolve("include"))
            
        
    

【讨论】:

感谢您的评论。我使用 Groovy 而不是 Kotlin 作为我的 gradle。相关语法是什么? 我刚刚用我的 build.gradle 代码编辑了我的答案

以上是关于如何在 Kotlin/Multiplatform 项目中使用 .klib 库的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Multiplatform:如何在 iOS 的单元测试中模拟对象

如何在 Android 和 JVM 目标之间共享 Java 代码(使用 Kotlin Multiplatform)?

如何在 kotlin Multiplatform 和 Swift 中使用默认接口实现

Kotlin Multiplatform Mobile:Ktor - 如何在 Kotlin Native(iOS)中取消活动协程(网络请求、后台工作)?

如何在 Android Studio 中为 Kotlin Multiplatform 配置 iOS 应用程序?

如何使用 Cocoapods 调整 Kotlin Multiplatform 项目的 Swift 类名?