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

【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]のファイルを見てみましょう。

//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);
    }
}


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

2013-10-21-dds

Android側の実装

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

//MyProject.java 

   public static void func1(){
   	
		//Androidでの処理を記述

   }



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


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

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

Android側の実装

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

2013-10-21-sdsdds


ここに、iOS側で呼び出したいメソッドを記載します。
  • パッケージ名 : jp.albatrus.com.MyProject
  • 呼び出すメソッド:func1


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

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



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


//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();
    	
    }



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

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



Related Posts Plugin for WordPress, Blogger...