C/C++からScalaのライブラリを呼ぶ with JNI

JavaからScalaにかえても同じことができるか実験

@kmizuさんのアドバイスでコールバックもできるようになりました.


前回,前々回までのHoge, HogeBackクラスをScalaのそれに直すと以下のようになる

package scalatest;
 
class Hoge{
  def printHoge():Unit = println("Hoge in scala!")
  def getHoge():String = "Hoge"
  def add(i:Int, j:Int):Int = i + j
  def getMsg(msg:String):String = "Hoget is " + msg
  @native def callbackMethod(num:Int):Int
  def invokeMethod(num:Int):Int = {
    println("Invoking Method");
    return callbackMethod(num);
  }
}

ネイティブの関数が代入されるべきcallbackMethodには@nativeアノテーション*1がついている.
これをつけることでJavaでのnativeキーワードと同じようなことができる, との@kmizuさん
のアドバイスによりなんとか動くところまでこぎつけました。

Cの側では2点ほど修正が必要。1つは取得してくるクラス名。
もう1つは起動時オプション. java.class.pathにscala-library.jarのパスを指定する必要がある.
この環境はMacなので

options[0].optionString = "-Djava.class.path=.:/opt/local/share/java/scala-library.jar";

としておけばOK


これにより同じようにCからScalaのコードを呼んだり、コールバックを登録して呼ばせたりなんてことができるようです


ちなみに、ローカルディレクトリにscala-library.jarを持ってくるだけでも、このコードに関しては動くらしい。そのさいは"-Djava.class.path=.:scala-library.jar"としておく。