Как использовать kotlin.system с Kotlin Native?

#android #kotlin #kotlin-native

#Android #kotlin #kotlin-native

Вопрос:

Я хотел бы использовать системные функции, такие как 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"
    }
  

Также я не могу найти ни одного примера использования или этого модуля.

Ответ №1:

getTimeMillis() доступно только для JVM а Native не для Common и JS .

Если вы не вызовете 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

Комментарии:

1. Я использую getTimeMillis() в машинном коде, и он все еще не может найти метод. :/

2. Я поделился примером, который я использую на github.com/eggeral/kotlin-native-system-package

3. Спасибо, что приложили столько усилий, помогая мне. Я вижу, что ваш проект определен для macOS, я пытаюсь использовать Android и iOS с включенными исходными наборами — возможно, в этом разница.

4. Другими словами, я понимаю, что мне это нужно для общего пользования. Я просто подумал, что «общий» — это «родной».

5. В этом случае вам нужно использовать ‘actual’ и ‘expect’. Я обновил свой ответ и проект Github, чтобы показать, как это сделать.

Ответ №2:

На случай, если сюда попадет кто-нибудь, кто использует kotlin native (как сказано в названии), решение состоит в том, чтобы добавить импорт:

 import kotlin.system.getTimeMillis;
  

Спасибо,