首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法在Kotlin多平台中解析cinterop IOS导入

无法在Kotlin多平台中解析cinterop IOS导入
EN

Stack Overflow用户
提问于 2020-12-08 23:45:45
回答 2查看 202关注 0票数 0

我按照Kotlin文档添加了iOS依赖项。在我的例子中,依赖项是通过第三方提供的预编译框架。因此,我遵循了没有cocoapod的框架的情况。

我将我的MyFramework.def文件放在/src中

代码语言:javascript
代码运行次数:0
运行
复制
language = Objective-C
modules = MyFramework
package = MyFramework

然后,我将以下代码添加到Kotlin对象`中的build.gradle.kts中

代码语言:javascript
代码运行次数:0
运行
复制
ios {
    binaries {
        framework {
            baseName = "shared"
        }
    }
}
iosArm64() {
    compilations.getByName("main") {
        val JWBLe by cinterops.creating {
            // Path to .def file
            defFile("src/nativeInterop/cinterop/MyFramework.def")

            compilerOpts("-framework", "MyFramework", "-F/Users/user/Projects/MyFramework/ios/SDK")
        }
    }

    binaries.all {
        // Tell the linker where the framework is located.
        linkerOpts("-framework", "MyFramework", "-F/Users/user/Projects/MyFramework/ios/SDK")
    }
}
sourceSets {
    val commonMain by getting
    val commonTest by getting {
        dependencies {
            implementation(kotlin("test-common"))
            implementation(kotlin("test-annotations-common"))
        }
    }
    val androidMain by getting {
        dependencies {
            implementation("com.google.android.material:material:1.2.1")
        }
    }
    val androidTest by getting {
        dependencies {
            implementation(kotlin("test-junit"))
            implementation("junit:junit:4.13")
        }
    }
    val iosMain by getting
    val iosTest by getting
}

然后我构建这个项目。确实可以看到这个库,我看到在External Libraries中有一个shared-cinterop-MyFramework.klib

但是,当我尝试将这个包导入到src/iosMain/kotlin/com.example.testapp.shared/platform.kt下的代码中时,我得到了库的未解决错误。似乎我还需要向sourceSets添加一些东西?但我不确定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-09 15:45:21

首先,我注意到Gradle脚本是不正确的。在本例中,cinterop目标声明了两次-由target shortcut声明,另一次是在配置iosArm64的位置声明的。为了避免这种重复,最好像这样配置cinterop:

代码语言:javascript
代码运行次数:0
运行
复制
ios()
    val iosArm = targets.getByName("iosArm64") as  org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
    // A bit dirty cast, but as I'm sure iosArm64 is the Native target, it should be fine. Needed to make highlighting below work as expected.
    iosArm.apply {
        compilations.getByName("main") {
            val JWBLe by cinterops.creating {
                // Path to .def file
                defFile("src/nativeInterop/cinterop/MyFramework.def")

                compilerOpts("-framework", "MyFramework", "-F/Users/user/Projects/MyFramework/ios/SDK")
            }
        }
        binaries.all {
            // Tell the linker where the framework is located.
            linkerOpts("-framework", "MyFramework", "-F/Users/user/Projects/MyFramework/ios/SDK")
        }
    }

但是,这种调整对从iosMain访问cinterop绑定没有帮助。在commonizer的当前状态下,它只能共享platform libraries。因此,不管怎样,将利用这些绑定的所有代码移到src/iosArm64Main文件夹中是目前可用的最佳选择。这是一个问题,从官方跟踪器到向上投票和订阅- Support commonization of user-defined libraries

票数 2
EN

Stack Overflow用户

发布于 2020-12-09 00:12:11

因此,在尝试了一段时间后,我找到了答案。

为iosMain不可用的iosArm64模块设置了依赖项。

我创建了另一个文件夹src/iosArm64Main,并将源文件放在那里。在这一点上,它能够解析库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65202139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档