标签: kotlin-native

kotlin.native.concurrent.InvalidMutabilityException:在 Kotlin 多平台 (iOS) 中使用 ktor 时尝试冻结 <object> 的突变

我正在尝试构建一个简单的 Kotlin 多平台应用程序,该应用程序调用互联网以使用 ktor 从互联网获取一些字符串。我从Kotlin 会议应用程序中获取了一些我编译的功能,它在 Android 和 iOS 上都运行良好。

但是,在我的示例应用程序中,它仅适用于 Android,但在 iOS 上它会返回

kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen <object>@c422ffe8

这是GitHub 存储库,下面是我的代码:

// src/commonMain/CoroutinePresenter.kt

open class CoroutinePresenter(
    private val mainContext: CoroutineContext, // TODO: Use Dispatchers.Main instead when it will be supported on iOS
    private val baseView: BaseView
): CoroutineScope {

    private val job = Job()
    private val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
        baseView.showError(throwable)
    }

    override val coroutineContext: CoroutineContext
        get() = mainContext + job + …
Run Code Online (Sandbox Code Playgroud)

ios kotlin ktor kotlin-native kotlin-multiplatform

4
推荐指数
1
解决办法
2406
查看次数

readLine() 在 Kotlin/Native 中不等待用户输入

这是一个简单的脚本

fun main() {
    print("ready> ")
    val input = readLine()
    println("User input: $input")
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,gradle runReleaseExecutableMacos我希望我会看到一个ready>提示,并且有可能输入一些字符。但这个程序User input: null结果立即结束。

我错过了什么吗?

kotlin kotlin-native

4
推荐指数
1
解决办法
522
查看次数

如何在 kotlin 原生中使用 swift 库?

如何在 Kotlin/Native 中使用 Swift 库?

我正在尝试使用 cinteropt 来使用 Objective-c 库,Kotlin/Native但我似乎无法弄清楚如何使用 swift 库?

有人可以在这里指导我吗?提前致谢。

kotlin kotlin-native kotlin-multiplatform

4
推荐指数
1
解决办法
506
查看次数

kotlin.native.concurrent.InvalidMutabilityException:KMM iOS 中冻结 kotlin.collections.HashMap@3ee0f08 的突变尝试

我使用的是 Kotlin 1.5.10 和 ktor 1.6.0。

当我执行网络提取时

    private suspend fun getHello(): Model.Result {
        return httpClient.get("https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=multiplatform")
    }

Run Code Online (Sandbox Code Playgroud)

使用数据模型

    object Model {
        @Serializable
        data class Result(val query: Query)
        @Serializable
        data class Query(val searchinfo: SearchInfo)
        @Serializable
        data class SearchInfo(val totalhits: Int)
    }
Run Code Online (Sandbox Code Playgroud)

Android 版本编译良好并响应

Result(query=Query(searchInfo=SearchInfo(totalhits=707)))
Run Code Online (Sandbox Code Playgroud)

但是,当我在 iOS 中编译它时,它返回崩溃

RESPONSE https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=multiplatform failed with exception: 
kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlin.collections.HashMap@2566888
Run Code Online (Sandbox Code Playgroud)

这个StackOverflow建议下载到1.3.10,但我不能这样做,因为 KMM 不会在我最新的 Android Studio 4.2.1 中编译。此外,我不将协程用于 commonMain 代码(仅在 Android 代码中)。

这个StackOverflow状态问题与Kodein,但我不使用Kodein

注意:我的代码与https://www.youtube.com/watch?v=_Q62iJoNOfg …

kotlin ktor kotlin-native kotlin-multiplatform kotlin-multiplatform-mobile

4
推荐指数
1
解决办法
167
查看次数

Kotlin/Native - 非法尝试访问非共享 &lt;object&gt;

在我的应用程序中,我有两个类,一个继承自 kotlin 类的 swift 类:

迅捷类:

public class MySensor: RawSensor

    [...]

    public override func notifyChanged(values: KotlinFloatArray) {
      super.notifyChanged(values: values)
    }
}
Run Code Online (Sandbox Code Playgroud)

科特林类:

package com.mycompany.myapp.mypackage.sensors.rawsensors

import com.mycompany.myapp.mypackage.util.Observable

abstract class RawSensor : Observable() {

  protected abstract val sensorDataType: RawSensorData.SensorDataType

  abstract val currentTime: Long

  protected open fun notifyChanged(values: FloatArray) {
      notifyObservers(RawSensorData(values, sensorDataType, currentTime))
  }

  abstract fun start()

  abstract fun stop()
}
Run Code Online (Sandbox Code Playgroud)

super.notifyChanged(values: values)被调用时,应用程序崩溃,并出现以下错误:

Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared <object>@83cb47c8 from other thread
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal …
Run Code Online (Sandbox Code Playgroud)

shared-memory ios kotlin swift kotlin-native

3
推荐指数
1
解决办法
2070
查看次数

在 Swift 中使用协程流

我们目前如何从 swift收集Flow

通过在 Swift流的collect方法中对 Kotlin 的挂起函数的新支持,可以在 swift 中获得这个相当笨重的签名

vm.topStoriesFlow.collect(
 collector: Kotlinx_coroutines_coreFlowCollector,
 completionHandler: @escaping (KotlinUnit?, Error?) -> Void
)
Run Code Online (Sandbox Code Playgroud)

知道如何使用它,或者即使当前支持它的使用吗?

kotlin kotlin-native kotlin-multiplatform kotlin-coroutines kotlin-flow

3
推荐指数
1
解决办法
958
查看次数

空的 KMM 项目卡住了 gradle 同步

我正在尝试将一些业务逻辑从我的 iOS 应用程序转移到 KMM。当突然开始在工作室遇到问题时,我已经做了一些工作。它没有构建,有奇怪的metaspace错误等。老实说,我在我的项目周围跳动了几个小时和几天 - 没有结果。我决定完全卸载工作室及其所有相关文件。

在那之后,我什至无法正确构建一个空的 KMM 项目。简单的 Android 项目工作得很好。只有 KMM 才会出现问题。当我第一次创建项目时,它已成功加载,下载所有依赖项并同步。我能够看到“Android”项目结构。我试图通过./gradlew build- 错误来构建它。没有完整的描述,只有失败任务的名称 - compile kotlin to ios arm64。一个全新项目中的错误。我尝试重建项目 - 没有运气。所以我重新启动了工作室,魔法的第二部分开始了。

从这一刻起,每当我打开一个新的或现有的 KMM 项目时,它就会开始同步并卡住。例如,我无法打开项目结构,因为同步正在进行,我无法添加依赖项,因为同步正在进行。但是我可以通过./gradlew build它来构建它并且它会构建!好吧,我尝试了更多命令,例如./gradlew -refresh-dependencies等。它构建成功。然后在某个时候所有的代码都变成了红色。下面你可以同时看到Android Studio的所有颜色:

在此处输入图片说明

在终端中,您可以看到它已成功构建。在右下角,您可以看到它不允许进入项目结构,因为正在进行同步。最美丽的是所有未解决的符号。

我相信我已经尝试了大部分 Android Studio 的东西:

  • 使缓存无效并重新启动
  • 只需重新启动
  • 重建项目
  • ./gradlew clean build
  • 删除 ~/.gradle 和 ./gradle 并重建
  • 重新启动笔记本电脑
  • 更新所有插件等。

伙计们,您有什么想法可以让工作室只与 KMM 一起工作吗?然后我应该如何让它继续工作?正如我已经说过的,问题不是特定于工作室的,而是特定于 KMM 的,因为常规的 android 项目构建得很好。

安卓工作室 4.1.2

Mac OS 大苏尔 11.2

Kotlin 1.4.30-release-Studio4.1-1

android kotlin android-studio kotlin-native kotlin-multiplatform

3
推荐指数
1
解决办法
549
查看次数

如何为 iOS 制作多模块 kotlin 多平台库?

我正在尝试制作一个可在 Android、JavaScript 和 iOS 中使用的 Kotlin 多平台库。该库由多个模块组成,因此可以轻松扩展。我现在的问题只与 Kotlin 原生有关。

这是项目的设置方式

  • 一个模块 :common
object MySingleton {
    fun doSomethingWithMyInterface(value: MyInterface) {
        // ...
    }
}

interface MyInterface {
  fun doSomething()
}
Run Code Online (Sandbox Code Playgroud)
  • 其他模块实现 MyInterface
class MyInterfaceExample : MyInterface {
    override fun doSomething() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我已将build.gradle.kts文件设置:common如下:

plugins {
    kotlin("multiplatform")
    kotlin("native.cocoapods")
    id("maven-publish")
}

kotlin {
    targets {
        jvm()
        js().browser()
        ios("ios") {
            binaries {
                framework("CommonModule") {
                    baseName = "common"
                }
            }
        }
    }

    cocoapods {
        frameworkName = "CommonModule"
        summary …
Run Code Online (Sandbox Code Playgroud)

kotlin-native kotlin-multiplatform

3
推荐指数
1
解决办法
1026
查看次数

如何使用 Kotlin/Native 应用程序将字符串写入剪贴板(Windows 操作系统)?

我对 Kotlin 非常陌生,并且在 Windows 上使用 Kotlin/Native 制作命令行 .exe。应用程序应从文本文件中读取并逐行打印在屏幕上。当它到达文件的最后一行时,应该将其放入剪贴板。

aFile.txt看起来像这样:

one
two
three
...
...
the last line
Run Code Online (Sandbox Code Playgroud)

到目前为止我的代码read.kt(Kotlin/Native)是这样的:

import kotlinx.cinterop.*
import platform.posix.*

fun main(args: Array<String>) {

    if (args.size != 1) {
        println("Usage: read.exe <file.txt>")
        return
    }

    val fileName = args[0]
    val file = fopen(fileName, "r")

    if (file == null) {
        perror("cannot open input file $fileName")
        return
    }

    try {
        memScoped {
            val bufferLength = 64 * 1024
            val buffer = allocArray<ByteVar>(bufferLength)

            do {
                val nextLine = fgets(buffer, …
Run Code Online (Sandbox Code Playgroud)

clipboard kotlin kotlin-native

2
推荐指数
1
解决办法
1160
查看次数

Kotlin 多平台中的 CPointer

我找不到任何有关如何在 Kotlin Multiplatform 中获取 CPointer 的示例,并且现有文档也没有多大帮助。在我的 iOS 源代码集中,我需要构建与以下 Swift 代码等效的 Kotlin(仅包括代码的相关部分):

  ...(hex: String) {

if hex.hasPrefix("#") {
    let start = hex.index(hex.startIndex, offsetBy: 1)
         let scanner = Scanner(string: hexColor)
         var hexNumber: UInt64 = 0



          if scanner.scanHexInt64(&hexNumber) {

            r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
           ....
Run Code Online (Sandbox Code Playgroud)

我遇到问题的具体部分是

扫描仪.scanHexInt64(&hexNumber)

这是 Kotlin 代码和问题

//input to function - hex: String
    val scanner = NSScanner(hex)
    if (hex.startsWith("#")) {
        scanner.scanLocation = 1u
    }
    var hexNumber : UInt32 = 0u
    /*Type mismatch.
    Required:
    CPointer<UIntVar /* = …
Run Code Online (Sandbox Code Playgroud)

c kotlin swift kotlin-native kotlin-multiplatform

2
推荐指数
1
解决办法
2434
查看次数