将 .klib 库添加到 kotlin 多平台

Posted

技术标签:

【中文标题】将 .klib 库添加到 kotlin 多平台【英文标题】:Adding a `.klib` library to kotlin multiplatform 【发布时间】:2019-12-01 20:43:50 【问题描述】:

我想知道如何将我的 cinterop-ted 库导入到 kotlin 多平台构建的 gradle 构建。

我已经创建了library.def 文件并填充了它,我还生成了library.klib 和它附带的文件夹。 我只是不明白如何将其导入 gradle。

我浏览了整个互联网,发现了对 Konan 的引用,我想知道这是我必须使用的东西,还是用于类似于“cinterop”的东西。

我查看了以下链接,但没有发现任何远程连接到我的问题的.klib import 部分。

Link #1 (kotlinlang.org)

Link #2 (github.com)

Link #3 (plugins.gradle.org)

【问题讨论】:

你最终设法让它工作了吗?我也创建了我的.klib,但不知道如何加载它。也许你最后使用了 Gradle .interops,但我还不能让它工作。 我很确定我完全放弃了这个项目。我不确定我是否曾经让它工作,但在那些日子里,Kotlin Native 仍处于起步阶段。 我会在明天工作时添加一个答案(希望如此)。目前我的 Gradle 甚至无法识别 interops 关键字。我希望我现在是 80 年代的 6502 开发人员,哈哈 @IMlolenstine 还没有。我已经取得了进展(请参阅我的帖子***.com/questions/66851318/…),但仍在努力。我决定继续解决这个问题,但也致力于 Kotlin/Native/JNI 解决方案。这样我就得到了我想要的工作(尽管不是使用 KMM),但如果我设法让 KMM 工作,我可以轻松地重用我的 Kotlin/JNI 代码。我会继续研究 KMM,希望能在某个时候让它工作并更新这篇文章和另一篇文章。 @IMlolenstine 嘿,我想我为我的用例找到了解决方案(C/C++ 互操作)。也许它也可能对你有用。在我之前评论的链接 SO 问题中查看 Artyom 答案中的 cmets ???? 【参考方案1】:

一般来说,您会想要使用多平台插件。如果您要单独构建一个 klib,那么您正在创建一些额外的步骤(可能)。在 Link #2 中,它说平台插件已被弃用。 Konan 是本机平台/编译器的名称。去年有一个单独的插件,但你肯定不想使用它。

我刚刚创建了一个示例,但它还没有公开,所以这是我手头最好的一个:

https://github.com/JetBrains/kotlin-native/blob/3329f74c27b683574ac181bc40e3836ceccce6c1/samples/tensorflow/build.gradle.kts#L12

我正在开发 Firestore 库。本机和互操作配置位于多平台配置中。

kotlin 

    android 
        publishAllLibraryVariants()
    
//        iosArm64()
    iosX64("ios")
        compilations["main"].cinterops 
            firebasecore 
                packageName 'cocoapods.FirebaseCore'
                defFile = file("$projectDir/src/iosMain/c_interop/FirebaseCore.def")
                includeDirs ("$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public")
                compilerOpts ("-F$projectDir/src/iosMain/c_interop/modules/FirebaseCore-$versions.firebaseCoreIos")
            
            firestore 
                packageName 'cocoapods.FirebaseFirestore'
                defFile = file("$projectDir/src/iosMain/c_interop/FirebaseFirestore.def")
                includeDirs ("$projectDir/../iosApp/Pods/FirebaseFirestore/Firestore/Source/Public", "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public")
                compilerOpts ("-F$projectDir/src/iosMain/c_interop/modules/FirebaseFirestore-$versions.firebaseFirestoreIos")
            
        
    

cinterops 设置 def 文件的位置和参数。然后我将整个内容发布为一个多平台库。实际的原生工件最终是一个 klib,但它都是由 gradle 和依赖元数据管理的。

【讨论】:

好的,我已经从 github 上的示例中复制了 KotlinDSL 代码,但是我在导入 org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget 时出错,因为它会将 jetbrains 染成红色。我怎样才能导入它?

以上是关于将 .klib 库添加到 kotlin 多平台的主要内容,如果未能解决你的问题,请参考以下文章

将 kotlin 多平台库发布到 Maven Central(InvalidMavenPublicationException 多个工件具有相同的......)

无法将 FirebaseAnalytics 或 Crashlytics cocoapod 添加到 kotlin 多平台共享模块

使用多平台模拟 kotlin 中的常见测试

Kotlin 通用库可在多个 MPP 中重用

从 ktor 提供 kotlin 多平台 javascript

如何在 Kotlin 标准库(多平台)上获取当前的 unixtime