具有本机库的多平台库

时间:2019-07-26 09:55:11

标签: kotlin kotlin-multiplatform kotlin-native

我正在尝试为kotlin创建一个多平台库,而我想使用本机cinterop(ted)库来实现。

我将其导入gradle中,并加载,如果将commonMain更改为Native,则加载库,否则为红色。

这是我目前正在尝试做的事情吗?我们可以将本机(交叉使用的)库导入常见的kotlin吗?

我将gradle文件添加到底部(Kotlin DSL)

plugins {
    id("org.jetbrains.kotlin.multiplatform").version("1.3.41")
    id("maven-publish")
}
repositories {
    mavenCentral()
}
group = "xyz.mglolenstine"
version = "0.0.1"

kotlin {
    jvm()
    js {
        browser {
        }
        nodejs {
        }
    }
    // For ARM, should be changed to iosArm32 or iosArm64
    // For Linux, should be changed to e.g. linuxX64
    // For MacOS, should be changed to e.g. macosX64
    // For Windows, should be changed to e.g. mingwX64
    linuxX64("linux")
    val commonMain by sourceSets.getting {
        dependencies {
            implementation(kotlin("stdlib-common"))
            implementation(fileTree("libs"))
        }
    }
    val commonTest by sourceSets.getting {
        dependencies {
            implementation(kotlin("test-common"))
            implementation(kotlin("test-annotations-common"))
            implementation(fileTree("libs"))
        }
    }
    val jvmMain by sourceSets.getting {
        dependencies {
            implementation(kotlin("stdlib-jdk8"))
            implementation(fileTree("libs"))
        }
    }
    val jvmTest by sourceSets.getting {
        dependencies {
            implementation(kotlin("test"))
            implementation(kotlin("test-junit"))
            implementation(fileTree("libs"))
        }
    }
    val jsMain by sourceSets.getting {
        dependencies {
            implementation(kotlin("stdlib-js"))
            implementation(fileTree("libs"))
        }
    }
    val jsTest by sourceSets.getting {
        dependencies {
            implementation(kotlin("test-js"))
            implementation(fileTree("libs"))
        }
    }
    val linuxMain by sourceSets.getting {
        dependencies {
            implementation(fileTree("libs"))
        }
    }
    val linuxTest by sourceSets.getting {
        dependencies {
            implementation(fileTree("libs"))
        }
    }
}

如果我可以做些改进gradle文件的事情,请告诉我,因为我还是Kotlin DSL的新手,并且我的待办事项也有改进。

2 个答案:

答案 0 :(得分:1)

我想这是不可用的,就cinterop工具而言,它仅为外部库创建绑定,而不为表示形式创建绑定。而且,klib是纯本机工具,如您在documentation中所见。

答案 1 :(得分:-1)

使用expect/actual机制,可以使用平台相关的代码为给定类创建不同的实现,该机制的工作原理类似于接口:

expect class Foo {
    fun bar(): String
}

actual class WindowsFoo : Foo() {
    actual fun bar(): String {
        return "Windows platform calls go here"
    }
}