読者です 読者をやめる 読者になる 読者になる

フニゲの開発日記

Electronとか...

ネイティブ(Objective-CとかJava)のメソッドを呼び出す

Cocos2d-JS

 このへんはだいぶ楽になった。v2の時と同じようにLocalStorage経由で情報を渡すハックもできるが、もう使うことはないかも知れない。

 例として、iOSのバンドルID(またはAndroidのパッケージ名)を返すメソッドを書いてみる。複数のアプリで同じソースコードを共有していて、アプリによって動作を変えたい時に使えるだろう。
 jsb.reflection.callStaticMethodの引数はjOSとAndroidで違うので、場合分けが必要になる。

var getAppId = function () {
    if (cc.sys.os == cc.sys.OS_IOS) {
        return jsb.reflection.callStaticMethod(
            "RootViewController", "getAppId");
    } else if (cc.sys.os == cc.sys.OS_ANDROID) {
        return jsb.reflection.callStaticMethod(
            "org/cocos2dx/javascript/AppActivity", "getAppId", "()Ljava/lang/String;")
    }
    return null;
};

 iOS側の実装はframework/runtime-src/project.ios_mac/ios/RootViewController.mmに追加した。

...
+ (NSString *)getAppId {
    return [[NSBundle mainBundle] bundleIdentifier];
}

 本当はこれだけでいいと思うのだが、どうも今のバージョン (v3.3) はObjective-Cから文字列を返すところにバグがあるようで、23文字未満の文字列だと正常な値が取得できなかった。しょうがないので、適当な文字で埋めて23文字以上になるようにして返す。

+ (NSString *)getAppId {
//  return [[NSBundle mainBundle] bundleIdentifier]; // うーん……

    NSString *appId = [[NSBundle mainBundle] bundleIdentifier];
    return [NSString stringWithFormat:@"%@------------------", appId];
}

 末尾の余計な"----"はjavaScript側で後で取り除けばいいだろう。

 Androidも同様。frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.javaを適当に修正して、パッケージ名を返すメソッドを追加する。

...
public class AppActivity extends Cocos2dxActivity {
    private static String appId = null; // 追加

    @Override
    public Cocos2dxGLSurfaceView onCreateView() {
        appId = getApplicationContext().getPackageName(); // 追加

        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
        // TestCpp should create stencil buffer
        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
        return glSurfaceView;
    }

    public static String getAppId() {
        return appId;
    }
}
広告を非表示にする