Kotlin Multiplatform Mobile 找不到 klib 包

2023-12-02

我读过这些帖子1, 2, 3面临类似的问题。我正在尝试使用.klib在我的 KMM Android 项目中。 Klib 是由library.hC 标头。这就是我所做的:

我构建了 Kotlin 库

在 KMM 中使用以下 Gradle 块shared项目:

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
        }
    }
}

with mylib.def file

headers = /home/me/CLionProjects/mylib/library.h
headerFilter = /home/me/CLionProjects/mylib/*
package = c.mylib

在建筑方面,.klib并且构建文件夹出现在classes共享项目目录如下图:

enter image description here

下面的红线Platform是为了错误:

预期的类“Platform”在模块 MyApplication.shared.androidNativeArm64Main 中没有针对 Native 的实际声明

但显然这可能只是一个系统故障(不确定 - Alt+Enter 解决方案“创建实际类...”似乎没有做任何事情)。假设这不是问题,我继续......

我检查.klib details

Running .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

我想访问.klib在我里面androidApp项目。我尝试了两个包c.mylib and com.example.myapplication:shared-cinterop-mylib.

我尝试添加implementation("com.example.myapplication:shared-cinterop-mylib") to my androidAppGradle 文件,但出现错误:

无法确定任务“: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")
    }

但我不确定这是将文件添加到存储库的正确方法。

Question

谁能帮我让包裹得到认可androidApp?我会继续努力。


您可能对针对不同平台的不同 Kotlin 版本感到困惑。请查看文档有关详细信息,同时我将尝试在这里解释基本概念。

Kotlin Multiplatform 通常由三种不同的编译器组成:一种为 JVM 构建,一种用于转换为 JS,一种用于编译特定于平台的本机二进制文件(可执行文件、静态或共享库)。 KMM 技术旨在在两个不同的平台(iOS 和 Android)之间共享代码。

这里重要的细节是 KMM 的目标是让开发人员更容易地将这些共享代码包含到他们现有的代码库中 - 通常是 iOS 的 Swift 或 Objective-C 以及 Android 的 Java 或 Kotlin/JVM。这很重要,因为该项目是使用 Kotlin/Native 和 Kotlin/JVM 构建的。

在您的代码中,我看到了额外的平台声明。这androidNativeArm64,这是一个 Kotlin/Native 目标,而不是经典的 Android 目标。它使用另一个编译器,并生成一个共享库。这就是为什么

  1. 您可以定义 cinterop 块,为标头创建绑定,但是
  2. 这些绑定仅作为 Kotlin/Native 编译的一部分适用。

您在此处创建的 KLIB 本身并不是一个库,而是一组原生库的绑定(mylib)。它为您提供了使用的能力mylib来自 Kotlin 代码的 API,编写在androidNativeArm64Main源集。由于您目前没有这样的源集,您的项目无法正确构建,并显示有关的警告missing actual declaration.

总结以上所有内容。以下是在项目的当前状态下您可以执行和不能执行的操作:

Can

  • 使用 Kotlin/Native 代码中的绑定(将文件添加到shared/src/androidNativeArm64Main/kotlin/)
  • 使用这些绑定到共享库来编译代码(.so file)
  • 按照 Android NDK 文档中的说明使用此共享库(here)

or

  • 删除 Kotlin/Native Android 目标,以及不使用 C API 的代码shared/src/androidMain/kotlin/

Cannot

  • 依赖于 Kotlin/JVM 模块中的 KLIB(例如androidApp一般项目或androidMain源设置在shared)
  • 发布绑定并且不关心将生成的工件与 C 库链接
  • 使用从 Kotlin/Native 编译的共享或静态库比使用 C/C++ 原生库更容易(抱歉,但这将是您在这里可能试图避免的 JNI 事情)

抱歉回答又长又复杂,如有任何问题请在下面的评论部分与我联系。我很乐意纠正我的任何错误或不准确之处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin Multiplatform Mobile 找不到 klib 包 的相关文章

随机推荐

  • 如何使用 ctypes 将 Python 列表列表转换为 C 数组?

    正如这里所见如何使用 ctypes 将 Python 列表转换为 C 数组 此代码将获取一个 Python 数组并将其转换为 C 数组 import ctypes arr ctypes c int len pyarr pyarr 对于列表的
  • 使用 get_Keys() 方法进行集合是否正确

    与此问题相关 我可以将名为 keys 的键添加到哈希表而不覆盖 keys 成员吗 我实际上经常使用get Keys method作为推荐的PSBase property只会转移问题 换句话说 在解决方案如下的情况下 对于未知的目录键列表 此
  • Numpy 检查两个数组的元素近似相等

    我有两个带有浮点值的 numpy 数组 我试图找到数字大致相等的索引 浮点比较 所以像这样 x np random rand 3 y np random rand 3 x 2 y 2 Do the comparison and it sho
  • UITableView 单元格中的 UITextField 返回 null

    我已经在这件事上用头撞墙已经有一段时间了 非常感谢任何意见或指示 因此 目标是从表中的文本字段创建登录表单 该用户信息一旦收集 将被传递到单独视图控制器中的数组 以便可以存储在 收藏夹 列表中 因此 我创建了看起来很棒的表单 但是当我控制台
  • 如何配置 Zend_Form 使用数组表示法?

    我在配置 Zend Form 时遇到困难 我有一个 Zend Form 子类 该表格包含一些必需信息和一些附加信息 我希望可以通过数组访问附加信息 提交的数据将如下所示 formData required1 formData require
  • 在 C# 中创建接口实例

    我正在 C 中使用 MS Excel 互操作 但我不明白这行特定的代码是如何工作的 var excel new Microsoft Office Interop Excel Application 其中 Microsoft Office I
  • 模板类的复制构造函数

    我读到模板 copy con 永远不是默认的复制构造函数 并且模板赋值操作永远不是复制赋值运算符 我不明白为什么需要这个限制 并立即上网 ideone 并返回一个测试程序但在这里 复制构造函数永远不会在进一步谷歌搜索时被调用 我遇到了模板化
  • 如何使用 System.Text.Json 处理同一属性的单个项目和数组?

    我正在尝试反序列化一些 JSON 其中包含的值有时是数组 有时是单个项目 我怎样才能做到这一点System Text Json and JsonSerializer 这个问题的灵感来自这个问题对于 Json NET 通过罗伯特 麦克劳斯 我
  • 仅当满足条件时启动discord.py命令冷却

    我希望仅当满足函数中的条件时才开始其中一个命令的冷却 如下所示 bot command async def move ctx destination destinations d1 d2 d3 List of valid arguments
  • ViewBag、ViewData 和 TempData

    任何人都可以解释一下何时使用 TempData ViewBag ViewData 我有一个要求 我需要在控制器一中设置一个值 该控制器将重定向到控制器二 控制器二将渲染视图 我尝试使用 ViewBag 当我到达控制器二时 该值丢失了 我能知
  • Apache HTTP 服务器上的 SSL [关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 我有 2 个用于 Apache 服务器的 crt 文件 1 root bundle crt 2 我的域名 com crt 和其他捆绑包 1 中级 crt 2 我的域名 com c
  • 尝试在 symfony 4 中安装 sonata admin 时出错

    我尝试在 symfony 4 项目中安装 sonata admin 用户包 composer create project symfony website skeleton my project composer require sonat
  • CloudBlob.OpenRead() 未读取所有数据

    使用 Windows Azure 存储客户端库 CloudBlob OpenRead 方法仅读取 4 mb 的数据 如何使用 OpenRead 方法读取完整流 CloudBlob blob container GetBlobReferenc
  • SetTimeOut 计时器内的 JQuery GetJSON

    任何人都可以发布示例代码 其中有一个正在运行的计时器 javascript settimeout 并进行数据检索 基本上我这个计时器的作用是显示新消息 myFunction param data retrieval operation us
  • 自动滚动到底部

    我正在开发带有聊天屏幕的应用程序 但与普通屏幕一样 它开始从上到下滚动 但应该是从下到上 该应用程序位于 Telerik Nativescript 平台中 View xml
  • 如何为 Autodesk Forge App 指定多个回调 URL?

    您可以注册多个回调 URL 回调 URL 工具提示中有说明 但没有关于如何输入多个 URL 的示例 正确的分隔符是什么 我试过 n 这是工具提示上的拼写错误 我们将修复它 今天您可以使用 2022 年 9 月更新 此功能现已推出
  • x86 中如何使用进位和溢出标志来计算乘法

    当两个数字相乘溢出寄存器时 如何使用两个标志来正确计算答案 E g if al holds 0xff并乘以0x2 导致溢出到ax 这些标志对此有何帮助 Multiplication on x86 x64 never overflows wh
  • C# 控制台应用程序 - 如何使用 GDI+ 在 BMP/JPG 文件中绘图?

    我想使用 C 控制台应用程序和 GDI 在 BMP 或 JPG 文件中绘制矩形 箭头 文本 线条等形状 这是我在网上找到的 c 将 System Drawing Graphics 保存到文件c 将 System Drawing Graphi
  • 值文件上传 - 适用于 Chrome,但不适用于 IE,Image img = Image.FromStream(Request.InputStream)

    我正在使用 Valum 上传的稍微修改的版本 github链接 我已将其修改为上传到数据库 但未修改它用于将文件作为输入流放入请求中的 javascript 以下代码行在 IE 8 中失败 但已确认在 Chrome 中可以工作 using
  • Kotlin Multiplatform Mobile 找不到 klib 包

    我读过这些帖子1 2 3面临类似的问题 我正在尝试使用 klib在我的 KMM Android 项目中 Klib 是由library hC 标头 这就是我所做的 我构建了 Kotlin 库 在 KMM 中使用以下 Gradle 块share