#はじめに
RoboVMからネイティブコードを呼び出す方法をまとめました。
私もまだ勉強中ですので不完全ですが検証出来た所から徐々に書いて行こうと思います。
#JNIを使う。
Javaの標準の方法です。
だいたいJavaのJNIと同じですが、NewWeakGlobalRefがサポートされていません。
#Broを使う。
RoboVMにはBroと呼ばれる、Javaから直接CやObjective Cのメソッドを呼び出す仕組みがあります。
JNIのようにCやC++のコードを書かなくても使えるため便利です。
https://github.com/robovm/robovm/wiki/The-Bro-Java-to-native-bridge
##ObjectiveC
このようなObjectiveCのクラスがあるとします。
@interface Test : NSObject
- (void) hello;
@end
これはJava側でこのようなクラスを作って呼び出す事が出来ます。
@Library(Library.INTERNAL)
@NativeClass
public class Test extends NSObject {
static {
ObjCRuntime.bind(Test.class);
}
private static final Selector hello = Selector.register("hello");
@Bridge private native static void objc_hello(Person __self__, Selector __cmd__);
public void hello() {
objc_hello(this, hello);
}
}
objc_helloメソッドの名前は任意で構いません。大事なのはSelectorです。今回は引数無しですのでhelloという名前になっています。もし引数が1個の場合はこのようになります。
private static final Selector foo = Selector.register("foo:");
@Bridge private native static void objc_foo(Person __self__, Selector __cmd__, int arg1);
引数が複数ある場合はこのようになります。
private static final Selector foo = Selector.register("foo:arg2:");
@Bridge private native static void objc_foo(Person __self__, Selector __cmd__, int arg1, int arg2);