【问题标题】:How to use kotlin.system with Kotlin Native?如何在 Kotlin Native 中使用 kotlin.system?
【发布时间】:2019-04-01 12:27:31
【问题描述】:

我想使用像 getTimeMillis() 这样的系统函数,它应该是 kotlin.system 的一部分:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.system/index.html

但是编译器说这样的模块不能被导入。 gradle 配置是这样的(kotlin 多平台项目):

    commonMain.dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.10"
        implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.10.0"
        implementation "io.ktor:ktor-client:1.0.0"
        implementation "io.ktor:ktor-client-logging:1.1.0"
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0"
    }

我也找不到任何使用示例或此模块。

【问题讨论】:

    标签: android kotlin kotlin-native


    【解决方案1】:

    getTimeMillis() 仅适用于 JVMNative 不适用于 CommonJS

    如果您在 Native 模块的源目录中调用 getTimeMillis(),编译器可以找到该函数。

    如果您需要在Common 中调用,您必须自己实现Common 包装器函数,并自己在每个平台上实现包装器。

    为了做到这一点,创建一个存根函数和一个在你的公共模块中使用它的函数。例如:

    expect fun getSystemTimeInMillis(): Long
    
    fun printSystemTimeMillis() {
        println("System time in millis: ${getSystemTimeInMillis()}")
    }
    

    然后在您的平台特定模块中实现该功能。例如在 JVM 模块中:

    actual fun getSystemTimeInMillis() = System.currentTimeMillis()
    

    或者在原生模块中,例如:

    actual fun getSystemTimeInMillis() = getTimeMillis()
    

    另请参阅:https://github.com/eggeral/kotlin-native-system-package

    【讨论】:

    • 我在本机代码中使用 getTimeMillis() 仍然找不到方法。 ://
    • 我分享了我在github.com/eggeral/kotlin-native-system-package上使用的示例
    • 感谢您付出如此多的努力帮助我。我看到你的项目是为 MacOS 定义的,我正在尝试使用 Android 和 iOS,并启用了 sourceSets - 也许这就是区别。
    • 换句话说,我意识到我需要它 Common。我只是认为“Common”是“Native”。
    • 在这种情况下,您需要使用“实际”和“预期”。我更新了我的答案和 Github 项目以展示如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多