【cocos2dx】JNIを利用して、iOSとAndroid間のやりとりをする。

cocos2dxの最大の特徴は、一つのリソース(コードや素材)で、iOS/Androidのアプリが作成できることです。 ただ、広告やtwitterなど、それぞれのOSごとに個別の設定をしないといけない場合があります。この時に利用できるのが、JNIという機能です。 これを使えば、プロジェクト上で記載をしたメソッドをiOS/Androidともに利用できたりします。 今回は、この「JNI」の利用方法を紹介します。

iOS->Androidのメソッドを呼び出す

iOS(Xcode)上から、Androidのメソッドを呼び出す方法を紹介します。

主な利用方法

  • 広告の表示・非表示
  • tweetの呼び出し

iOS側の実装

まずは以下のような3つのファイルを作成してください。

2013-10-21-33232

[.cpp]は、Android側のメソッドを呼び出すために使います。 [.mm]には、iOS側で呼び出すメソッドを記載します。

それでは[.cpp]のファイルを見てみましょう。 [c]

//JniController.cpp

include "JniController.h"

include "platform/android/jni/JniHelper.h"

include <jni.h>

include <android/log.h>

// 呼び出すメソッドが書かれているパッケージ名とjavaクラス名

define CLASS_NAME "jp/albatrus/com/MyProject"

using namespace std; using namespace cocos2d;

//今回はfunc1をメソッド名にしています。 void JniController::func1() { JniMethodInfo t; // クラス名とメソッド名を指定します。 if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "func1", "()V")) { // voidなので、CallStaticVoidMethodで呼ぶ t.env->CallStaticVoidMethod(t.classID, t.methodID); // 解放 t.env->DeleteLocalRef(t.classID); } }

[/c]

注意していただきたいのが、Android側で呼び出すメソッドが記載されているパッケージ名です。 例えば、呼び出したいメソッドが以下の様な場合は、上記で書いたようになります。

2013-10-21-dds

Android側の実装

iOSの設定ができれば、後は、先ほど指定したパッケージにあるJavaファイルにメソッドを記載すれば完了です。 [c]

//MyProject.java

public static void func1(){

    //Androidでの処理を記述

}

[/c]

これで完了です。 後は、fnuc1メソッドを必要な箇所で呼び出して下さい。

Android->iOSのメソッドを呼び出す

今度は、先ほどとは逆に、Andorid側からiOSのメソッドを呼び出す方法です。

Android側の実装

[Jni]フォルダに入っている、main.cppを開きます。

2013-10-21-sdsdds

ここに、iOS側で呼び出したいメソッドを記載します。

  • パッケージ名 : jp.albatrus.com.MyProject
  • 呼び出すメソッド:func1

[c]

//メソッドを実行するプロジェクトとメソッドを記載します。

//javaパッケージ名メソッド名 と指定します。 void Java_jp_albatrus_com_MyProject_func1(JNIEnv* env, jobject thiz) { // cocos2d-x側で実行したいメソッドを書く AppDelegate::sharedScene()->func1(); }

[/c]

先ほど設定したパッケージ内のJavaファイル内で、メソッドが利用できます。 適切なタイミングで利用しましょう。

[c]

//MyProject.java

public class MyProject extends Cocos2dxActivity{

private static Cocos2dxActivity me = null;

//JNI
private static native void func1();

    protected void onCreate(Bundle savedInstanceState){

}


//アプリが終了する時
protected void onDestroy(){


   //JNIで設定したiOS側のメソッドを呼び出す
   MyProject.func1();

   super.onDestroy();

}

[/c]

iOS側、今回はAppDelegateクラスでfunc1()を書き忘れないように注意下さい。 これで、完了です。

こちらを参考にしました。 こちらも見てみて下さい。