ピエールの日記 by pierre 長尾和美

ピエールです。SamuraiTraditional(サムトラ)、たけしを(逸見泰典とのユニット)でギターやってます♪思いつきをブログに! ^^v by pierre

cocos2d-x C++からJavaを呼びだす方法

      2017/10/25

C++からJavaを呼びだす方法

自分の場合は各社広告を貼るときに利用しています。

JNIはJava(android)とC++(その他C言語など)をつなぐものです。
このJNIを使ってC++からjavaを呼び出します。
とりあえずjava(android)を呼び出すクラスを用意しておきます。
ここではJavaCall.cppとしておいて、中身はこんな感じです。

JavaCall.cpp


// JavaCall.cpp

#include "JavaCall.h"

// 下記2つをincludeする。
// JniHelperクラスはCocos2d-xで用意されている
// JNIを扱うためのクラス。

#include <jni.h>
#include "platform/android/jni/JniHelper.h"

// 使うjava(android)のクラスのパスを指定
// 自分は忘れがちになるので忘れないように!!

#define CLASS_NAME "com/hoge/SimpleGame"


// c++で呼び出せるクラス

void JavaCall::showView()
{
	cocos2d::JniMethodInfo methodInfo;
	
	// クラス名とメソッド名を指定します。
	// 第三引数は呼び出すjava(android)側のメソッドです。
	// 第四引数はシグネチャで、"()V"はvoid型ということ。
	// 他の型に関しては下記でまとめます。①を参照

	if (cocos2d::JniHelper::getStaticMethodInfo
		(methodInfo, CLASS_NAME, "showView", "()V")) {
	
	// 呼び出すjava側のメソッドがvoid型なので
	// CallStaticVoidMethodを使う。
	// こちらも下記でまとめます。②を参照

	methodInfo.env->
		CallStaticVoidMethod
			(methodInfo.classID, methodInfo.methodID);

	// 解放

	methodInfo.env->DeleteLocalRef(methodInfo.classID);
	}
}


①シグネチャに関して。
 この例の場合はjava(android)側がvoidの場合です。
 他の型の場合は下記を用いる。
 
 void    : V
 boolean : Z
 byte    : B
 char    : C
 short   : S
 int    : I
 long    : J
 float   : F
 double  : D
 クラス  :Lパッケージを含めたフルパス;
       例)String型 Ljava/lang/String;
 配列   :[シグニチャ
       例)double[] → [D

②この例の場合はjava(android)側がstaticメソッドの場合です。

・staticメソッドの場合
 戻り値なし        :CallStaticVoidMethod
 戻り値あり:例:Object型:CallStaticObjectMethod
          :int型  :CallStaticIntMethod

・インスタンスメソッド
 戻り値なし        :CallVoidMethod
 戻り値あり:例:Object型:CallObjectMethod
          :int型  :CallIntMethod

ただ、自分の場合はjava側をインスタンスメソッドにしてやってみましたが、どうもうまく動いてくれない。。
というわけで、java(android)側はstaticメソッドを使うもの。
と、決めつけてやりました。

java(android)側は下記のようになっています。

呼び出される側(SimpleGame.java)


// SimpleGame.java

	public static void showView(){
		me.runOnUiThread(new Runnable(){
			public void run(){
				if (adView == null) {
					
					// 広告を貼る処理など。ここでは省略。
					// 省略
					
				}
			}
		}
	}

たとえばタイトル画面(TitleScene.cpp)から呼び出す場合は下記となります。

呼び出し元(TitleScene.cpp)


// TitleScene.cpp

bool TitleScene::init(){
	bool bRet = false;
	do{
		
	// 広告用
	// public static でないとjavaを呼び出せない様子。。
	// JavaCallクラスのShowViewクラスを呼び出す。
	
		JavaCall::showView();
	
	// 省略
	
	}
}

広告の貼り方に関しては別途掲載しようかと。。。

 - cocos2d-x, アプリ ,