【发布时间】:2020-09-08 08:36:03
【问题描述】:
我正在尝试定义一个辅助方法来动态组合动态加载的函数。
import scala.scalanative.native._
@extern
@link("dl")
object dl {
def dlopen(path: CString, mode: CInt): Ptr[Byte] = extern
def dlsym(handle: Ptr[Byte], sym: CString): Ptr[Unit] = extern
}
object Sample extends App {
type Lambda = CFunctionPtr1[Ptr[Unit], Ptr[Unit]]
def compose[A,B](fs: Lambda*)(in: Ptr[A]): Ptr[B] =
fs.foldLeft(in.asInstanceOf[Ptr[Unit]]){case (acc, f) =>
f.apply(acc)
}.asInstanceOf[Ptr[B]]
def compose[A, B](f: Lambda, g: Lambda)(in: Ptr[A]): Ptr[B] =
g(f(in.asInstanceOf[Ptr[Unit]])).asInstanceOf[Ptr[B]]
Zone { implicit alloc =>
val handle = dl.dlopen(toCString("functions.so"), 1)
val fOne = dl.dlsym(handle, toCString("one")).asInstanceOf[Lambda]
val fTwo = dl.dlsym(handle, toCString("two")).asInstanceOf[Lambda]
val ptr = stdlib.malloc(sizeof[CInt]).asInstanceOf[Ptr[CInt]]
val result = compose[CInt, CBool](fOne, fTwo)(ptr)
println(!result)
}
}
上述代码适用于固定参数compose,但不适用于可变参数compose。
在后一种情况下,我得到:
[error] (Compile / nativeLink) scala.scalanative.util.UnsupportedException: can't cast from Class(Top(java.lang.Object)) to Ptr
我正在使用 scala native 0.3.9 和 scala 2.11.12。
【问题讨论】:
标签: scala-native