如何在 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)中取消活动协程(网络请求、后台工作)?