神記逸天プログラマーブルリーデイズ

行き詰まったことをメモっておく中二プログラマーのブログ。スマホアプリとかゲームアプリ関係が多い

二人は一身のようで、だけどけして一つではなくて (訳:CPPとJavaでアプリ内課金連携しました)

「二人の距離がどれだけ離れても、虚空に浮かぶ星を目指せば再び会える」


今日は、cocos2d-xからAndroid Javaを呼び出すところを実装。

なんてことはない部分のはずだったのだけれど、いろいろと手間取ってしまったよ!
アプリ内課金については前回の日記で書いた通り、Android単体ではとりあえず動くような感じになった。

今日はそれをcocos2d-xから呼び出す部分。

Javaとcppを行ったり来たり

ただ、Javaを呼ぶだけのやつはTwitterやLINEで最近実装したので、すぐ出来た。
こんな感じ。

void CCBilling::buyStart(int itemid){
	JniMethodInfo methodInfo;
	JNIEnv* pEnv = getJNIEnv();
	if(pEnv == 0){
	    return;
	}
	if(JniHelper::getStaticMethodInfo(methodInfo,CLASS_NAME,"buyStart","(I)V")){
	    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID,itemid);
	    methodInfo.env->DeleteLocalRef(methodInfo.classID);
	}
}

なんだけど、Javaからccpに戻って来る方法がわからなかった!
Androidでは、課金の手続きをした後にonActivityResultなるメソッドが非同期で呼ばれるので、そこからなんとかしてcppに戻ってきてアプリ側に「課金終わったー」という通知をしてあげないといけない。
どうしたものか。

google先生に聞いてみるとJavaからcppの呼び出しは修飾子という言葉を使うらしい!
そしてまたまやわかりやすい記事を発見!

http://symfoware.blog68.fc2.com/blog-entry-829.html

ここを参考にしながらJava側に

protected static native void buySuccess();

と技術して、cpp側には

extern "C"
{
	JNIEXPORT void JNICALL Java_com_sample_billingtest_MyActivity_buySuccess(JNIEnv* env, jclass cls, jobject obj){
		CCLog("成功したよ!");
	}
}

と記述。
こうするとJava側でbuySuccessが呼ばれた時にcpp側に戻ってこれるみたい!
いいね! いいね!
これでまたやれることが増えた!


課金については
AppC Cloudやsoomlaなどを入れたら早いけれど、こうやったjavaとcppの連携はいたる場所で使うので完全に身につけておきたい。
https://app-c.net/
http://soom.la/