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(); // 省略 } }
広告の貼り方に関しては別途掲載しようかと。。。