C/C++からScalaのライブラリを呼ぶ with JNI
@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"としておく。