将 .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 多平台共享模块