소프트웨어 개발/Scala - Functional

스칼라에서 DLL 라이브러리 이용하기

늘근이 2015. 5. 16. 18:55

DLL라이브러리는 동적 링크 라이브러리로써 자바에 붙여쓰러면 JNI나, JNA를 사용할수 있다.

 

jna.jar

 

package test

import 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]

  
}