如何避免错误;StaticFunction必须采用未绑定的…“;在Kotlin Native中,何时从C调用Kotlin回调函数?
这是一个关于回调函数的一般性问题,在Kotlin Native中定义,由C函数调用 为了便于讨论,假设我正在尝试递归地遍历文件系统中的目录,在Kotlin Native中使用。 (我知道还有其他方法可以做到这一点,使用其他C函数,但这不是问题的核心。) nftw()将函数作为回调函数:如何避免错误;StaticFunction必须采用未绑定的…“;在Kotlin Native中,何时从C调用Kotlin回调函数?,kotlin,kotlin-native,Kotlin,Kotlin Native,这是一个关于回调函数的一般性问题,在Kotlin Native中定义,由C函数调用 为了便于讨论,假设我正在尝试递归地遍历文件系统中的目录,在Kotlin Native中使用。 (我知道还有其他方法可以做到这一点,使用其他C函数,但这不是问题的核心。) nftw()将函数作为回调函数: val directory = "//some/directory" val callback = kotlinx.cinterop.staticCFunction { file: CPo
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)
val directory=“//some/directory”
val callback=kotlinx.cinterop.staticf函数{
文件:CPointer?,
统计:CPointer?,
typeFlag:Int,
b:CPointer?->
val fileName=文件?.toKString()
println(文件名)
val结果=0
后果
}
val深度=10
val标志=0
platform.posix.nftw(目录、回调、深度、标志)
这适用于通过“println()”列出文件,但只要lambda包含任何捕获的值,就会出现以下编译器错误:
“kotlinx.cinterop.staticf函数必须采用未绑定的非捕获函数或lambda”
我的问题是:有没有关于如何
从这样的回调访问任何非全局状态
我确实用一个全局变量想出了一个糟糕的解决办法,所以这不是我主要想要的。如果有一个普遍接受的解决方案使用@ThreadLocal或其他方法,请讨论。对于一般的本机回调(不特定于
nftw
)。C函数应该接受一个void*userData
参数,并在调用时将其传递给回调函数。这允许您向回调传递本地数据,而不是全局数据。
即使在C/C++中也是如此
对于这种特殊情况(不管语言如何),没有一些全局数据(或JIT,但我们不要考虑它),实际上没有一种方法可以做到这一点。因此,任何解决办法都必须是令人讨厌的
使用@ThreadLocal
是一个“合理的”解决方案
nftw
不是一个设计良好的C接口。通常用于本机回调(不特定于nftw
)。C函数应该接受一个void*userData
参数,并在调用时将其传递给回调函数。这允许您向回调传递本地数据,而不是全局数据。
即使在C/C++中也是如此
对于这种特殊情况(不管语言如何),没有一些全局数据(或JIT,但我们不要考虑它),实际上没有一种方法可以做到这一点。因此,任何解决办法都必须是令人讨厌的
使用@ThreadLocal
是一个“合理的”解决方案
nftw
不是一个设计良好的C接口