LoginSignup
7
7

More than 5 years have passed since last update.

RoboVMからネイティブコードを呼び出す。

Last updated at Posted at 2013-11-13

はじめに

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);
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7