我知道这是一个非常奇怪的用例,它依赖于为一些OS源代码集安装JVM,请允许我介绍一下我的用例。
我正在编写一个简单的实用程序来包装对steamCMD (https://developer.valvesoftware.com/wiki/SteamCMD)的调用,它有与平台相关的安装过程。所以,很自然我应该
// commonMain / steamCmdGetter.kt
expect interface SteamCmdGetter {
fun installClient()
}
// [OS] / steamCmdGetter.kt
actual interface SteamCmdGetter { /* ... */ }另一方面,我的实用工具还需要处理文件存储(例如,下载和检查客户端在存储中的存在),所以我也可以使用一个文件类。
// commonMain / File.kt
expect interface File我知道JB团队在其教程中有明确的建议。
我们建议您只对具有特定于平台的依赖项的Kotlin声明使用预期声明和实际声明。最好在共享模块中实现尽可能多的功能,即使这样做需要更多的时间。
然而,与警告相反,我不希望编写一个MyFile实现,以避免为这样一个常见的任务重新发明轮子,但是java.io.File在这个场景中占据主导地位,以至于我在Gradle / Maven上找不到任何Kotlin替代方案。
这是否意味着我最终不得不写MyFile?或者,是否有办法将Java库导入Kotlin平台sourceSets?
发布于 2020-10-01 09:13:57
首先,我们只能对jvm和android目标使用Java库,而不能使用Kotlin/Multiplatform提供的其他库。实际上,这正是使用Kotlin/JVM的目标子集。Kotlin/JS和Kotlin/Native都没有提供与Java的互操作性,它们有自己的互操作功能。请参阅此页以获得有关差异的一些详细信息。
特别是有关文件的处理。答案很可能是肯定的,你必须按目标实现它。这种工作通常是特定于平台的,因为它几乎不依赖于操作系统的实现。但是,您搜索的部分功能应该在platform.posix.* 平台库中找到,即使它看起来更像C风格。
网络上的快速搜索让我找到了这个社区图书馆的列表,也许它会有所帮助。此外,kotlinlang社区(find 这里)可能有一些有趣的解决方案可供共享。
https://stackoverflow.com/questions/64149715
复制相似问题