【发布时间】:2021-06-25 07:28:50
【问题描述】:
我已经阅读了这些 SO 帖子 1、2、3,它们面临着类似的问题。我正在尝试在我的 KMM Android 项目中使用.klib。 Klib 是从library.h C 标头构建的。这是我所做的:
我构建了 Kotlin 库
在 KMM shared 项目中使用以下 Gradle 块:
kotlin {
...
androidNativeArm64 { // target
compilations.getByName("main") {
val mylib by cinterops.creating {
defFile(project.file("mylib.def"))
packageName("c.mylib")
// Options to be passed to compiler by cinterop tool.
compilerOpts("-I/home/me/CLionProjects/mylib/")
// Directories for header search (an analogue of the -I<path> compiler option).
includeDirs.allHeaders("/home/me/CLionProjects/mylib/")
// A shortcut for includeDirs.allHeaders.
includeDirs("/home/me/CLionProjects/mylib/")
}
}
binaries {
sharedLib() // https://kotlinlang.org/docs/mpp-build-native-binaries.html#declare-binaries
}
}
}
带有mylib.def 文件
headers = /home/me/CLionProjects/mylib/library.h
headerFilter = /home/me/CLionProjects/mylib/*
package = c.mylib
在构建时,.klib 和 build 文件夹出现在共享项目的classes 目录中,如下所示:
Platform下面的红线是错误的:
预期的类 'Platform' 在模块 MyApplication.shared.androidNativeArm64Main for Native 中没有实际声明
但显然that may just be a system glitch(不确定-“创建实际类...”的 Alt+Enter 解决方案似乎没有做任何事情)。假设这不是问题,我继续...
我查看.klib详情
运行 .konan/.../bin/klib info mylib.klib 我没有将 c.mylib 作为包名,而是将 com.example.myapplication:shared-cinterop-mylib 改为(见下文)。我可以忍受(虽然不确定为什么它不是我在 Gradle 中指定的)
Resolved to: /home/me/AndroidStudioProjects/MyApplication/shared/build/classes/kotlin/androidNativeArm64/main/shared-cinterop-mylib
Module name: <com.example.myapplication:shared-cinterop-mylib>
ABI version: 1.4.1
Compiler version: 1.4.10
Library version: null
Metadata version: 1.4.0
IR version: 1.0.0
Available targets: android_arm64
我尝试将包包含在我的 androidApp Gradle 中
我想访问我的androidApp 项目中的.klib。我尝试了c.mylib 和com.example.myapplication:shared-cinterop-mylib 两个包。
我尝试将implementation("com.example.myapplication:shared-cinterop-mylib") 添加到我的androidApp Gradle 文件中,但出现错误:
无法确定任务 ':androidApp:lintVitalRelease' 的依赖关系。 无法解析配置“:androidApp:debugCompileClasspath”的所有工件。 找不到 com.example.myapplication:shared-cinterop-mylib:。 要求: 项目:androidApp 可能的解决方案:
- 声明提供工件的存储库,请参阅https://docs.gradle.org/current/userguide/declaring_repositories.html 上的文档
我不确定提示是否能解决问题,但我尝试使用例如将文件添加到 androidApp Gradle repositories { ... } 块
maven {
url = uri("/home/me/AndroidStudioProjects/MyApplication/shared/build/classes/kotlin/androidNativeArm64/main/shared-cinterop-mylib.klib")
}
但我不确定这是将文件添加到存储库的正确方法。
问题
谁能帮我让androidApp 中的包裹得到认可?我会继续努力的。
【问题讨论】:
标签: android-studio gradle kotlin-multiplatform kotlin-native kmm