好的,所以我想创建一个原生应用程序来读取一些环境变量,并根据一些业务逻辑,将它们的值更改为其他内容。我决定在 Kotlin 中做这件事。
通过创建函数,我设法找出了如何更改系统环境变量:
fun call(arg: String) = platform.posix.system(command)
fun setEnvironmentVariable(variable: String, value: String) {
println("Changing value of $variable to $value")
call("SETX $variable $value")
}
Run Code Online (Sandbox Code Playgroud)
但它只会改变值。我想将它存储在 Kotlin 变量中并对其进行一些操作。
发出语句 call("SET $variable") 将值打印到命令提示符,但我不知道如何从 Kotlin 捕获它。我想是否有一种方法可以将命令提示符的输出提取到一个字符串中,这样会更容易,即使 Windows 以 myvariable=myvalue 的形式输出它,而不仅仅是值。
提前致谢
我已经在线阅读了多个内容,但仍然无法理解 Kotlin 多平台移动版与 Kotlin Native 之间有明显区别吗?
我创建了 2 个简单的“Hello World!” 程序,一个使用 Kotlin,一个使用 Rust:
科特林:
fun main() {
println("Hello, world!")
}
Run Code Online (Sandbox Code Playgroud)
锈:
fun main() {
println("Hello, world!")
}
Run Code Online (Sandbox Code Playgroud)
我为两者生成了可执行文件:
kotlinc-native main.kt用于 Kotlin 和cargo build --releaseRust,然后使用ls -S -lh | awk '{print $5, $9}'.
我发现 Kotlin 原生生成的文件是 Rust 生成的文件大小的 1.48 倍。
为什么会存在这种差异?
fn main() {
println!("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)
此外,Rust 可以优化得更小,Kotlin 原生有没有类似的东西?
最初设定:
$ cargo new hello_world
构建:
$ cargo build
=> 589,004 bytes
优化步骤 1:
构建:
$ cargo build --release
=> 586,028 bytes
优化步骤 …
An exception occurred applying plugin request [id: 'org.jetbrains.kotlin.jvm', version: '1.3.40-eap-40']
> Failed to apply plugin [id 'org.jetbrains.kotlin.jvm']
> Cannot add extension with name 'kotlin', as there is an extension already registered with that name.
Run Code Online (Sandbox Code Playgroud)
这个错误发生在我的 build.gradle.kts 文件中
您是否碰巧在根据 Kotlin/Native GitHub 上提供的示例构建的 Kotlin Cocoapods 项目中看到此错误?
我想知道kotlin本机中是否存在一种通过posix调用命令并接收其终端输出的方法。例如,我想使“ git diff”命令正常工作,而不必创建一个临时文件,将输出写入该文件,然后从该文件中读取。
在SO上,我仅找到需要ProcessBuilder的解决方案,由于它是Java库,因此在kotlin-native上不可用。
这是一个关于回调函数的一般问题,在 Kotlin Native 中定义,由 C 函数调用。
为了便于论证,假设我正在尝试使用Kotlin Native中的https://linux.die.net/man/3/nftw递归地遍历文件系统中的目录。(我知道还有其他方法可以做到这一点,使用其他 C 函数,但这不是这个问题的核心。)
nftw() 将函数作为回调:
val directory = "//some/directory"
val callback = kotlinx.cinterop.staticCFunction {
file: CPointer<ByteVar>?,
stat: CPointer<stat>?,
typeFlag: Int,
b: CPointer<FTW>? ->
val fileName = file?.toKString()
println(fileName)
val result = 0
result
}
val depth = 10
val flags = 0
platform.posix.nftw(directory, callback, depth, flags)
Run Code Online (Sandbox Code Playgroud)
这适用于通过“println()”列出文件,但是一旦 lambda 包含任何捕获的值,我就会收到以下编译器错误:
“kotlinx.cinterop.staticCFunction 必须采用未绑定、非捕获函数或 lambda”。
我的问题是:是否有关于如何从此类回调访问任何非全局状态的推荐方法?
我确实想出了一个使用全局变量的讨厌的解决方法,所以这不是我主要寻找的。如果有使用@ThreadLocal或其他东西的普遍接受的解决方案,请讨论。
我正在尝试将 Kotlin 对象传递给 C 库,该库会将该对象传递给回调函数。这个函数是用 Kotlin 编写的,因此我可以使用这个对象并使用它。但是我找不到将 Kotlin 对象转换为 CPointer 的方法。我发现的唯一可能是我需要的东西是fun createKotlinObjectHolder(any: Any?): NativePtr和fun <reified T : Any> unwrapKotlinObjectHolder(holder: Any?): T。但即使我使用刚刚创建的NativePtr将其传递给解包函数,它也会失败并显示错误消息unrecognized selector sent to instance 0xXYZ。我做错了什么或者这些功能不是我应该使用的?
使用 libcURL 的示例代码:
fun writeCallback(ptr: CPointer<ByteVar>, ignored: ULong, size: ULong, userData: COpaquePointer?): ULong {
if (userData != null) {
unwrapKotlinObjectHolder<StringBuilder>(userData.rawValue).append("Hello")
}
return size
}
fun main() {
...
val curl = curl_easy_init()
...
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, staticCFunction(::writeCallback))
val stringBuilder = StringBuilder()
val nativePtr = createKotlinObjectHolder(stringBuilder)
val cPtr …Run Code Online (Sandbox Code Playgroud) 根据文档
Kotlin/Native 是一种将 Kotlin 代码编译为原生二进制文件的技术,无需虚拟机即可运行。它是一个基于 LLVM 的 Kotlin 编译器后端和 Kotlin 标准库的本机实现。
因此 K/N 使用 LLVM 将 Kotlin 代码编译为 iOS 的本机代码。Swift编译器还使用LLVM来优化和生成机器代码。
那么在 iOS 平台上编译的 K/N 代码与编译的 Swift 代码有什么区别吗?
最近几天,我一直在为这个例外而苦苦挣扎。
我有一个具有这些依赖项的 kotlin 多平台项目:
在尝试在本机中使用 httpClient 时,我一直被提到异常:
at kotlin.Throwable#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/Throwable.kt:23)
at kotlin.Exception#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/Exceptions.kt:23)
at kotlin.RuntimeException#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/Exceptions.kt:34)
at kotlin.native.concurrent.InvalidMutabilityException#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/native/concurrent/Freezing.kt:22)
at <global>.ThrowInvalidMutabilityException(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/native/concurrent/Internal.kt:93)
at <global>.MutationCheck(Unknown Source)
at kotlin.collections.HashMap.<set-length>#internal(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:16)
at kotlin.collections.HashMap#addKey(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:292)
at kotlin.collections.HashMap#put(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:68)
at org.kodein.di.internal.DITreeImpl#find(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DITreeImpl.kt:132)
at org.kodein.di.DITree#find$default(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DITree.kt:36)
at org.kodein.di.internal.DIContainerImpl#factory(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:158)
at org.kodein.di.DIContainer#factory$default(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:32)
at org.kodein.di.DIContainer#provider(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:76)
at org.kodein.di.DIContainer#provider$default(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:75)
at org.kodein.di.internal.DirectDIBaseImpl#Instance(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DirectDIImpl.kt:30)
at InvalidMutabilitySampleTest.<init>$lambda-6$lambda-5$lambda-4$lambda-3$lambda-2#internal(/Users/r.juszczyk/StudioProjects/lmhu-multiplatform-app/MultiplatformApp/src/iosTest/kotlin/InvalidMutabilitySampleTest.kt:26)
at InvalidMutabilitySampleTest.$<init>$lambda-6$lambda-5$lambda-4$lambda-3$lambda-2$FUNCTION_REFERENCE$3.invoke#internal(/Users/r.juszczyk/StudioProjects/lmhu-multiplatform-app/MultiplatformApp/src/iosTest/kotlin/InvalidMutabilitySampleTest.kt:25)
at InvalidMutabilitySampleTest.$<init>$lambda-6$lambda-5$lambda-4$lambda-3$lambda-2$FUNCTION_REFERENCE$3.$<bridge-UNNN>invoke(/Users/r.juszczyk/StudioProjects/lmhu-multiplatform-app/MultiplatformApp/src/iosTest/kotlin/InvalidMutabilitySampleTest.kt:25)
at io.ktor.client.HttpClientConfig.install$<anonymous>_1#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:69)
at io.ktor.client.HttpClientConfig.$install$<anonymous>_1$FUNCTION_REFERENCE$17.invoke#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:65)
at io.ktor.client.HttpClientConfig.$install$<anonymous>_1$FUNCTION_REFERENCE$17.$<bridge-UNNN>invoke(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:65)
at io.ktor.client.features.json.JsonFeature.Feature#prepare(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/JsonFeature.kt:129)
at io.ktor.client.HttpClientConfig.install$<anonymous>_1-2#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:77)
at io.ktor.client.HttpClientConfig.$install$<anonymous>_1-2$FUNCTION_REFERENCE$18.invoke#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:74)
at io.ktor.client.HttpClientConfig.$install$<anonymous>_1-2$FUNCTION_REFERENCE$18.$<bridge-UNNN>invoke(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:74)
at io.ktor.client.HttpClientConfig#install(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:97)
at io.ktor.client.HttpClient#<init>(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt:172)
at io.ktor.client.HttpClient#<init>(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt:81)
at io.ktor.client#HttpClient(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt:43)
Run Code Online (Sandbox Code Playgroud)
我设法在测试中重现了该崩溃:
class InvalidMutabilitySampleTest { …Run Code Online (Sandbox Code Playgroud) 如何在 Kotlin/Native 或 Kotlin Multiplatform 项目中使用 Gradle 将 Apple 依赖项添加到 Kotlin/Native 模块?
我不熟悉 Apple 和 Xcode 开发——我写了一点 Swift,但没有为 Xcode 项目配置额外的依赖项,所以如果我在这里有新手误解,请见谅。
Kotlin/Native 可与 Objective-C 和 Swift 互操作。在我在线浏览的许多示例项目中,Kotlin 被设置为用作 Apple (iOS) 模块的共享库。但是 Apple 依赖项中的定义可以从 Kotlin 代码中调用也应该是有意义的,就像 Java Maven 依赖项可以添加到 Gradle 构建脚本然后由 Kotlin 代码调用一样。
在名称翻译部分,它说:
platform.*预配置系统框架的包
在使用 IntelliJ IDEA 中的 Kotlin 多平台移动应用程序选项创建的项目中,此类定义包含在模块中模块文件夹中的platform包下。iosMainkotlinshared
但是,SwiftUI 不存在。更具体地说,就我而言,我尝试使用 SwiftUI 在 Kotlin 中直接构建 UI。目前是否有可能,然后如何使 SwiftUI“系统框架”也包括在内?
这是我build.gradle.kts在shared模块中的参考:
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform") version "1.4.30"
}
group …Run Code Online (Sandbox Code Playgroud) 我想编译并启动。
package korat
import tensorflow.TF_Version
fun main(args: Array<String>) {
print(TF_Version())
}
Run Code Online (Sandbox Code Playgroud)
当我运行命令时:
kotlinc-native /home/fnasibov/IdeaProjects/Korat/src/linuxMain/kotlin/korat/Test.kt -l tensorflow
Run Code Online (Sandbox Code Playgroud)
它返回一个错误:
error: could not find 'main' in '<root>' package.
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
添加后-e korat.main
有错误
error: compilation failed: Provider "jar" not found
*Source files: Test.kt
*Compiler version info: Konan: 0.9.3 / Kotlin: 1.3.0
*Output kind: PROGRAM
exception: java.nio.file.ProviderNotFoundException: Provider "jar" not found
Run Code Online (Sandbox Code Playgroud)