我按照Kotlin文档添加了iOS依赖项。在我的例子中,依赖项是通过第三方提供的预编译框架。因此,我遵循了没有cocoapod的框架的情况。
我将我的MyFramework.def文件放在/src中
language = Objective-C
modules = MyFramework
package = MyFramework
然后,我将以下代码添加到Kotlin对象`中的build.gradle.kts中
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添加一些东西?但我不确定。
发布于 2020-12-09 07:45:21
首先,我注意到Gradle脚本是不正确的。在本例中,cinterop目标声明了两次-由target shortcut声明,另一次是在配置iosArm64
的位置声明的。为了避免这种重复,最好像这样配置cinterop:
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。
发布于 2020-12-08 16:12:11
因此,在尝试了一段时间后,我找到了答案。
为iosMain不可用的iosArm64模块设置了依赖项。
我创建了另一个文件夹src/iosArm64Main,并将源文件放在那里。在这一点上,它能够解析库。
https://stackoverflow.com/questions/65202139
复制相似问题