二人は一身のようで、だけどけして一つではなくて (訳: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/