DLL라이브러리는 동적 링크 라이브러리로써 자바에 붙여쓰러면 JNI나, JNA를 사용할수 있다.
package testimport com.sun.jna.{Function => JNAFunction} import scala.language.dynamics import scala.collection.mutable class Library (val libName: String) extends Dynamic { class Invocation (val jnaFunction: JNAFunction, val args: Array[Object]) { def apply[R](implicit m: Manifest[R]): R = { if (m.runtimeClass == classOf[Unit]) { jnaFunction.invoke(args).asInstanceOf[R] } else { jnaFunction.invoke(m.runtimeClass, args).asInstanceOf[R] } } def as[R](implicit m: Manifest[R]) = apply[R](m) def asInstanceOf[R](implicit m: Manifest[R]) = apply[R](m) } def applyDynamic(functionName: String)(args: Any*): Invocation = { var jnaFunction: JNAFunction = null if (functionCache.contains(functionName)) { jnaFunction = functionCache(functionName) } else { jnaFunction = JNAFunction.getFunction(libName, functionName) functionCache(functionName) = jnaFunction } new Invocation(jnaFunction, args.map(_.asInstanceOf[Object]).toArray[Object]) } private val functionCache = mutable.Map.empty[String, JNAFunction] } object Library extends App { def apply(libName: String) = new Library(libName) // // Test code ... // val myLib = Library("xingAPI") // println(myLib.atol("0345")[Int]) // println(myLib.malloc(1000)[Long]) // myLib.printf("[printf] clock: %ld\n", myLib.clock().asInstanceOf[Int]).as[Unit] // myLib.printf("value: %d %f", 123, 3.12).as[Unit] }
'소프트웨어 개발 > Scala - Functional' 카테고리의 다른 글
윈도우 - 스칼라에서 네이티브 라이브러리 사용하기 (0) | 2015.05.22 |
---|---|
스칼라 OpenCL 라이브러리, 스칼라 C코드 라이브러리 (0) | 2015.05.22 |
Django Websocket구현하기 (0) | 2015.04.27 |
플레이 프레임워크 IDE에 에러가 날때. (0) | 2015.04.26 |
cache (0) | 2014.12.17 |